diff --git a/lldb/test/API/lang/swift/unmanaged_clang_bridged/Foo/Foo.h b/lldb/test/API/lang/swift/unmanaged_clang_bridged/Foo/Foo.h new file mode 100644 index 0000000000000..7deac3f3aa698 --- /dev/null +++ b/lldb/test/API/lang/swift/unmanaged_clang_bridged/Foo/Foo.h @@ -0,0 +1,2 @@ +typedef struct __attribute__((objc_bridge(id))) { +} *MyBridgedRef; diff --git a/lldb/test/API/lang/swift/unmanaged_clang_bridged/Foo/module.modulemap b/lldb/test/API/lang/swift/unmanaged_clang_bridged/Foo/module.modulemap new file mode 100644 index 0000000000000..5590b43a2d322 --- /dev/null +++ b/lldb/test/API/lang/swift/unmanaged_clang_bridged/Foo/module.modulemap @@ -0,0 +1,3 @@ +module Foo { + header "Foo.h" +} diff --git a/lldb/test/API/lang/swift/unmanaged_clang_bridged/Makefile b/lldb/test/API/lang/swift/unmanaged_clang_bridged/Makefile new file mode 100644 index 0000000000000..b9a0d11cbcd28 --- /dev/null +++ b/lldb/test/API/lang/swift/unmanaged_clang_bridged/Makefile @@ -0,0 +1,4 @@ +SWIFT_OBJC_INTEROP := 1 +SWIFT_SOURCES := main.swift +SWIFTFLAGS_EXTRAS = -Xcc -I$(SRCDIR)/Foo +include Makefile.rules diff --git a/lldb/test/API/lang/swift/unmanaged_clang_bridged/TestSwiftUnmanagedClangBridged.py b/lldb/test/API/lang/swift/unmanaged_clang_bridged/TestSwiftUnmanagedClangBridged.py new file mode 100644 index 0000000000000..eddabb996276f --- /dev/null +++ b/lldb/test/API/lang/swift/unmanaged_clang_bridged/TestSwiftUnmanagedClangBridged.py @@ -0,0 +1,43 @@ +import lldb +from lldbsuite.test.lldbtest import * +from lldbsuite.test.decorators import * +import lldbsuite.test.lldbutil as lldbutil + + +class TestSwiftUnmanagedClangBridged(TestBase): + @swiftTest + def test(self): + self.build() + target, process, thread, bkpt = lldbutil.run_to_source_breakpoint( + self, "break here", lldb.SBFileSpec("main.swift") + ) + self.runCmd("settings set symbols.swift-enable-ast-context false") + + frame = thread.frames[0] + + someU = frame.FindVariable("someU") + lldbutil.check_variable( + self, someU, typename="Swift.Unmanaged" + ) + self.assertEqual( + someU.GetChildMemberWithName("_value").GetValueAsUnsigned(), 0xdeadbeef + ) + + optU = frame.FindVariable("optU") + lldbutil.check_variable( + self, + optU, + typename="Swift.Optional>", + value="some", + ) + self.assertEqual( + optU.GetChildMemberWithName("_value").GetValueAsUnsigned(), 0xdeadbeef + ) + + nilU = frame.FindVariable("nilU") + lldbutil.check_variable( + self, + nilU, + typename="Swift.Optional>", + summary="nil", + ) diff --git a/lldb/test/API/lang/swift/unmanaged_clang_bridged/main.swift b/lldb/test/API/lang/swift/unmanaged_clang_bridged/main.swift new file mode 100644 index 0000000000000..e8be14917dfff --- /dev/null +++ b/lldb/test/API/lang/swift/unmanaged_clang_bridged/main.swift @@ -0,0 +1,14 @@ +import Foo + +@inline(never) +func makeNil() -> Unmanaged? { return nil } + +func f() { + let nilU: Unmanaged? = makeNil() + let p = UnsafeMutableRawPointer(bitPattern: 0xdeadbeef)! + let someU: Unmanaged = Unmanaged.fromOpaque(p) + let optU: Unmanaged? = Unmanaged.fromOpaque(p) + print("break here", nilU as Any) +} + +f() diff --git a/lldb/test/API/lang/swift/unmanaged_foundationtype/Makefile b/lldb/test/API/lang/swift/unmanaged_foundationtype/Makefile new file mode 100644 index 0000000000000..2a69023633b34 --- /dev/null +++ b/lldb/test/API/lang/swift/unmanaged_foundationtype/Makefile @@ -0,0 +1,3 @@ +SWIFT_SOURCES := main.swift + +include Makefile.rules diff --git a/lldb/test/API/lang/swift/unmanaged_foundationtype/TestSwiftUnmanagedFoundationType.py b/lldb/test/API/lang/swift/unmanaged_foundationtype/TestSwiftUnmanagedFoundationType.py new file mode 100644 index 0000000000000..cc5904454ead6 --- /dev/null +++ b/lldb/test/API/lang/swift/unmanaged_foundationtype/TestSwiftUnmanagedFoundationType.py @@ -0,0 +1,45 @@ +import lldb +from lldbsuite.test.lldbtest import * +from lldbsuite.test.decorators import * +import lldbsuite.test.lldbutil as lldbutil + + +class TestSwiftUnmanagedFoundationType(TestBase): + @swiftTest + @skipUnlessFoundation + def test(self): + """Inspect Unmanaged of a Clang-imported reference type without the AST context.""" + self.build() + target, process, thread, bkpt = lldbutil.run_to_source_breakpoint( + self, "break here", lldb.SBFileSpec("main.swift") + ) + self.runCmd("settings set symbols.swift-enable-ast-context false") + + frame = thread.frames[0] + + unmanaged = frame.FindVariable("unmanaged") + lldbutil.check_variable( + self, unmanaged, typename="Swift.Unmanaged" + ) + self.assertNotEqual( + unmanaged.GetChildMemberWithName("_value").GetValueAsUnsigned(), 0 + ) + + optUnmanaged = frame.FindVariable("optUnmanaged") + lldbutil.check_variable( + self, + optUnmanaged, + typename="Swift.Optional>", + value="some", + ) + self.assertNotEqual( + optUnmanaged.GetChildMemberWithName("_value").GetValueAsUnsigned(), 0 + ) + + nilUnmanaged = frame.FindVariable("nilUnmanaged") + lldbutil.check_variable( + self, + nilUnmanaged, + typename="Swift.Optional>", + summary="nil", + ) diff --git a/lldb/test/API/lang/swift/unmanaged_foundationtype/main.swift b/lldb/test/API/lang/swift/unmanaged_foundationtype/main.swift new file mode 100644 index 0000000000000..bdf62b702e085 --- /dev/null +++ b/lldb/test/API/lang/swift/unmanaged_foundationtype/main.swift @@ -0,0 +1,15 @@ +import Foundation + +@inline(never) +func makeNil() -> Unmanaged? { return nil } + +func f() { + let unmanaged: Unmanaged = Unmanaged.passUnretained( + CFErrorCreate(nil, kCFErrorDomainPOSIX, 0, nil)) + let optUnmanaged: Unmanaged? = Unmanaged.passUnretained( + CFErrorCreate(nil, kCFErrorDomainPOSIX, 0, nil)) + let nilUnmanaged: Unmanaged? = makeNil() + print("break here \(unmanaged)") +} + +f()