Author: Raphael Isemann Date: 2021-06-02T19:23:11+02:00 New Revision: 0ec761c3fc2a4bf8319c6eb38e46f9a201b79141
URL: https://github.com/llvm/llvm-project/commit/0ec761c3fc2a4bf8319c6eb38e46f9a201b79141 DIFF: https://github.com/llvm/llvm-project/commit/0ec761c3fc2a4bf8319c6eb38e46f9a201b79141.diff LOG: [lldb] Preserve type sugar when using SBValue::Dereference on C++ references When checking for type properties we usually want to strip all kind of type sugar from the type. For example, sugar like Clang's ElaboratedType or typedefs rarely influence the fundamental behaviour of a type such as its byte size. However we always need to preserve type sugar for everything else as it does matter for users that their variable of type `size_t` instead of `unsigned long` for example. This patch fixes one such bug when trying to use the SBValue API to dereference a type. Reviewed By: werat, shafik Differential Revision: https://reviews.llvm.org/D103532 Added: 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 Modified: lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp Removed: ################################################################################ diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp index c7bfdda2e13e2..9bc8837eada63 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -6435,7 +6435,7 @@ CompilerType TypeSystemClang::GetChildCompilerTypeAtIndex( 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()) { diff --git a/lldb/test/API/lang/cpp/dereferencing_references/Makefile b/lldb/test/API/lang/cpp/dereferencing_references/Makefile new file mode 100644 index 0000000000000..99998b20bcb05 --- /dev/null +++ b/lldb/test/API/lang/cpp/dereferencing_references/Makefile @@ -0,0 +1,3 @@ +CXX_SOURCES := main.cpp + +include Makefile.rules diff --git a/lldb/test/API/lang/cpp/dereferencing_references/TestCPPDereferencingReferences.py b/lldb/test/API/lang/cpp/dereferencing_references/TestCPPDereferencingReferences.py new file mode 100644 index 0000000000000..994e26f0e91e8 --- /dev/null +++ b/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") diff --git a/lldb/test/API/lang/cpp/dereferencing_references/main.cpp b/lldb/test/API/lang/cpp/dereferencing_references/main.cpp new file mode 100644 index 0000000000000..8228dc4113205 --- /dev/null +++ b/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 +} _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits