[Lldb-commits] [PATCH] D87481: [lldb] Ignore certain Clang type sugar when creating the type name

Raphael Isemann via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Tue Sep 22 04:38:07 PDT 2020


This revision was automatically updated to reflect the committed changes.
Closed by commit rGb5e49e91cb90: [lldb] Ignore certain Clang type sugar when creating the type name (authored by teemperor).
Herald added a project: LLDB.
Herald added a subscriber: lldb-commits.

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D87481/new/

https://reviews.llvm.org/D87481

Files:
  lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
  lldb/test/API/lang/cpp/elaborated-types/Makefile
  lldb/test/API/lang/cpp/elaborated-types/TestElaboratedTypes.py
  lldb/test/API/lang/cpp/elaborated-types/main.cpp


Index: lldb/test/API/lang/cpp/elaborated-types/main.cpp
===================================================================
--- /dev/null
+++ lldb/test/API/lang/cpp/elaborated-types/main.cpp
@@ -0,0 +1,9 @@
+struct Struct {
+  int x;
+};
+
+int main() {
+  Struct use;
+  use.x = 3;
+  return use.x; // break here
+}
Index: lldb/test/API/lang/cpp/elaborated-types/TestElaboratedTypes.py
===================================================================
--- /dev/null
+++ lldb/test/API/lang/cpp/elaborated-types/TestElaboratedTypes.py
@@ -0,0 +1,40 @@
+"""
+Test elaborated types (e.g. Clang's ElaboratedType or TemplateType sugar).
+"""
+
+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__)
+
+    @no_debug_info_test
+    def test(self):
+        self.build()
+        self.dbg.CreateTarget(self.getBuildArtifact("a.out"))
+
+        # Add a type formatter for 'Struct'.
+        self.expect("type summary add Struct --summary-string '(summary x=${var.x})'")
+        # Check that creating an expr with an elaborated type ('::Struct')
+        # triggers our formatter for 'Struct' while keeping the elaborated type
+        # as the display type.
+        result = self.expect_expr("::Struct s; s.x = 4; s",
+                                  result_type="::Struct",
+                                  result_summary="(summary x=4)")
+        # Test that a plain elaborated type is only in the display type name but
+        # not in the full type name.
+        self.assertEqual(result.GetTypeName(), "Struct")
+
+        # Test the same for template types (that also only act as sugar to better
+        # show how the template was specified by the user).
+
+        # Declare a template that can actually be instantiated.
+        # FIXME: The error message here is incorrect.
+        self.expect("expr --top-level -- template<typename T> struct $V {};",
+                    error=True, substrs=["Couldn't find $__lldb_expr() in the module"])
+        result = self.expect_expr("$V<::Struct> s; s",
+                                  result_type="$V< ::Struct>")
+        self.assertEqual(result.GetTypeName(), "$V<Struct>")
Index: lldb/test/API/lang/cpp/elaborated-types/Makefile
===================================================================
--- /dev/null
+++ lldb/test/API/lang/cpp/elaborated-types/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
@@ -3639,6 +3639,16 @@
 
   clang::QualType qual_type(GetQualType(type));
 
+  // Remove certain type sugar from the name. Sugar such as elaborated types
+  // or template types which only serve to improve diagnostics shouldn't
+  // act as their own types from the user's perspective (e.g., formatter
+  // shouldn't format a variable differently depending on how the ser has
+  // specified the type. '::Type' and 'Type' should behave the same).
+  // Typedefs and atomic derived types are not removed as they are actually
+  // useful for identifiying specific types.
+  qual_type = RemoveWrappingTypes(qual_type,
+                                  {clang::Type::Typedef, clang::Type::Atomic});
+
   // For a typedef just return the qualified name.
   if (const auto *typedef_type = qual_type->getAs<clang::TypedefType>()) {
     const clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl();


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D87481.293412.patch
Type: text/x-patch
Size: 3704 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20200922/7f8afbf2/attachment.bin>


More information about the lldb-commits mailing list