[Lldb-commits] [lldb] 0ec761c - [lldb] Preserve type sugar when using SBValue::Dereference on C++ references

Raphael Isemann via lldb-commits lldb-commits at lists.llvm.org
Wed Jun 2 10:23:28 PDT 2021


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
+}


        


More information about the lldb-commits mailing list