[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