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 @@ -4238,7 +4238,13 @@ if (qual_type->isPointerType()) qual_type = ast->getPointerType( GetFullyUnqualifiedType_Impl(ast, qual_type->getPointeeType())); - else + else if (const ConstantArrayType *arr = + ast->getAsConstantArrayType(qual_type)) { + qual_type = ast->getConstantArrayType( + GetFullyUnqualifiedType_Impl(ast, arr->getElementType()), + arr->getSize(), arr->getSizeExpr(), arr->getSizeModifier(), + arr->getIndexTypeQualifiers().getAsOpaqueValue()); + } else qual_type = qual_type.getUnqualifiedType(); qual_type.removeLocalConst(); qual_type.removeLocalRestrict(); diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-advanced/TestDataFormatterAdv.py b/lldb/test/API/functionalities/data-formatter/data-formatter-advanced/TestDataFormatterAdv.py --- a/lldb/test/API/functionalities/data-formatter/data-formatter-advanced/TestDataFormatterAdv.py +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-advanced/TestDataFormatterAdv.py @@ -65,10 +65,12 @@ self.runCmd("type summary clear") self.runCmd( - "type summary add --summary-string \"${var[]}\" -x \"int\\[[0-9]\\]") + "type summary add --summary-string \"${var[]}\" -x \"^int\\[[0-9]\\]") self.expect("frame variable int_array", substrs=['1,2,3,4,5']) + self.expect("frame variable const_int_array", + substrs=['11,12,13,14,15']) # this will fail if we don't do [] as regex correctly self.runCmd( diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-advanced/main.cpp b/lldb/test/API/functionalities/data-formatter/data-formatter-advanced/main.cpp --- a/lldb/test/API/functionalities/data-formatter/data-formatter-advanced/main.cpp +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-advanced/main.cpp @@ -144,7 +144,8 @@ cool_array[2].character = 'Q'; int int_array[] = {1,2,3,4,5}; - + const int const_int_array[] = {11, 12, 13, 14, 15}; + IWrapPointers wrapper; *int_array = -1; diff --git a/lldb/unittests/Symbol/TestTypeSystemClang.cpp b/lldb/unittests/Symbol/TestTypeSystemClang.cpp --- a/lldb/unittests/Symbol/TestTypeSystemClang.cpp +++ b/lldb/unittests/Symbol/TestTypeSystemClang.cpp @@ -912,6 +912,32 @@ EXPECT_EQ(method->getDeclName().getObjCSelector().getAsString(), "foo"); } +TEST_F(TestTypeSystemClang, GetFullyUnqualifiedType) { + CompilerType bool_ = m_ast->GetBasicType(eBasicTypeBool); + CompilerType cv_bool = bool_.AddConstModifier().AddVolatileModifier(); + + // const volatile bool -> bool + EXPECT_EQ(bool_, cv_bool.GetFullyUnqualifiedType()); + + // const volatile bool[47] -> bool[47] + EXPECT_EQ(bool_.GetArrayType(47), + cv_bool.GetArrayType(47).GetFullyUnqualifiedType()); + + // const volatile bool[47][42] -> bool[47][42] + EXPECT_EQ( + bool_.GetArrayType(42).GetArrayType(47), + cv_bool.GetArrayType(42).GetArrayType(47).GetFullyUnqualifiedType()); + + // const volatile bool * -> bool * + EXPECT_EQ(bool_.GetPointerType(), + cv_bool.GetPointerType().GetFullyUnqualifiedType()); + + // const volatile bool *[47] -> bool *[47] + EXPECT_EQ( + bool_.GetPointerType().GetArrayType(47), + cv_bool.GetPointerType().GetArrayType(47).GetFullyUnqualifiedType()); +} + TEST(TestScratchTypeSystemClang, InferSubASTFromLangOpts) { LangOptions lang_opts; EXPECT_EQ(