diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ b/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()) { const clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl(); diff --git a/lldb/test/API/lang/cpp/elaborated-types/Makefile b/lldb/test/API/lang/cpp/elaborated-types/Makefile new file mode 100644 --- /dev/null +++ b/lldb/test/API/lang/cpp/elaborated-types/Makefile @@ -0,0 +1,3 @@ +CXX_SOURCES := main.cpp + +include Makefile.rules diff --git a/lldb/test/API/lang/cpp/elaborated-types/TestElaboratedTypes.py b/lldb/test/API/lang/cpp/elaborated-types/TestElaboratedTypes.py new file mode 100644 --- /dev/null +++ b/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 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") diff --git a/lldb/test/API/lang/cpp/elaborated-types/main.cpp b/lldb/test/API/lang/cpp/elaborated-types/main.cpp new file mode 100644 --- /dev/null +++ b/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 +}