This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rG0ec761c3fc2a: [lldb] Preserve type sugar when using SBValue::Dereference on C++ references (authored by teemperor). Herald added a subscriber: lldb-commits.
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D103532/new/ https://reviews.llvm.org/D103532 Files: lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp lldb/test/API/lang/cpp/dereferencing_references/Makefile lldb/test/API/lang/cpp/dereferencing_references/TestCPPDereferencingReferences.py lldb/test/API/lang/cpp/dereferencing_references/main.cpp Index: lldb/test/API/lang/cpp/dereferencing_references/main.cpp =================================================================== --- /dev/null +++ lldb/test/API/lang/cpp/dereferencing_references/main.cpp @@ -0,0 +1,8 @@ +typedef int TTT; + +int main() { + int i = 0; + TTT &l_ref = i; + TTT &&r_ref = static_cast<TTT &&>(i); + return l_ref; // break here +} Index: lldb/test/API/lang/cpp/dereferencing_references/TestCPPDereferencingReferences.py =================================================================== --- /dev/null +++ lldb/test/API/lang/cpp/dereferencing_references/TestCPPDereferencingReferences.py @@ -0,0 +1,23 @@ +import lldb +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil + +class TestCase(TestBase): + + mydir = TestBase.compute_mydir(__file__) + + def test(self): + """Tests deferencing lvalue/rvalue references via LLDB's builtin type system.""" + self.build() + lldbutil.run_to_source_breakpoint(self, "// break here", lldb.SBFileSpec("main.cpp")) + + # Take an lvalue reference and call `Dereference` on the SBValue. + # The result should be `TTT` (and *not* for example the underlying type + # 'int'). + lref_val = self.expect_var_path("l_ref", type="TTT &") + self.assertEqual(lref_val.Dereference().GetType().GetName(), "TTT") + + # Same as above for rvalue references. + rref_val = self.expect_var_path("r_ref", type="TTT &&") + self.assertEqual(rref_val.Dereference().GetType().GetName(), "TTT") Index: lldb/test/API/lang/cpp/dereferencing_references/Makefile =================================================================== --- /dev/null +++ lldb/test/API/lang/cpp/dereferencing_references/Makefile @@ -0,0 +1,3 @@ +CXX_SOURCES := main.cpp + +include Makefile.rules Index: lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp =================================================================== --- lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -6435,7 +6435,7 @@ case clang::Type::RValueReference: if (idx_is_valid) { const clang::ReferenceType *reference_type = - llvm::cast<clang::ReferenceType>(parent_qual_type.getTypePtr()); + llvm::cast<clang::ReferenceType>(GetQualType(type).getTypePtr()); CompilerType pointee_clang_type = GetType(reference_type->getPointeeType()); if (transparent_pointers && pointee_clang_type.IsAggregateType()) {
Index: lldb/test/API/lang/cpp/dereferencing_references/main.cpp =================================================================== --- /dev/null +++ lldb/test/API/lang/cpp/dereferencing_references/main.cpp @@ -0,0 +1,8 @@ +typedef int TTT; + +int main() { + int i = 0; + TTT &l_ref = i; + TTT &&r_ref = static_cast<TTT &&>(i); + return l_ref; // break here +} Index: lldb/test/API/lang/cpp/dereferencing_references/TestCPPDereferencingReferences.py =================================================================== --- /dev/null +++ lldb/test/API/lang/cpp/dereferencing_references/TestCPPDereferencingReferences.py @@ -0,0 +1,23 @@ +import lldb +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil + +class TestCase(TestBase): + + mydir = TestBase.compute_mydir(__file__) + + def test(self): + """Tests deferencing lvalue/rvalue references via LLDB's builtin type system.""" + self.build() + lldbutil.run_to_source_breakpoint(self, "// break here", lldb.SBFileSpec("main.cpp")) + + # Take an lvalue reference and call `Dereference` on the SBValue. + # The result should be `TTT` (and *not* for example the underlying type + # 'int'). + lref_val = self.expect_var_path("l_ref", type="TTT &") + self.assertEqual(lref_val.Dereference().GetType().GetName(), "TTT") + + # Same as above for rvalue references. + rref_val = self.expect_var_path("r_ref", type="TTT &&") + self.assertEqual(rref_val.Dereference().GetType().GetName(), "TTT") Index: lldb/test/API/lang/cpp/dereferencing_references/Makefile =================================================================== --- /dev/null +++ lldb/test/API/lang/cpp/dereferencing_references/Makefile @@ -0,0 +1,3 @@ +CXX_SOURCES := main.cpp + +include Makefile.rules Index: lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp =================================================================== --- lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -6435,7 +6435,7 @@ case clang::Type::RValueReference: if (idx_is_valid) { const clang::ReferenceType *reference_type = - llvm::cast<clang::ReferenceType>(parent_qual_type.getTypePtr()); + llvm::cast<clang::ReferenceType>(GetQualType(type).getTypePtr()); CompilerType pointee_clang_type = GetType(reference_type->getPointeeType()); if (transparent_pointers && pointee_clang_type.IsAggregateType()) {
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits