Index: lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp =================================================================== --- lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -2506,6 +2506,13 @@ case clang::Type::TypeOfExpr: type = type->getLocallyUnqualifiedSingleStepDesugaredType(); break; + case clang::Type::TemplateSpecialization: { + auto ty = cast(type); + if (!ty->isSugared()) + return type; + type = ty->desugar(); + break; + } default: return type; } Index: lldb/test/API/lang/cpp/template-specialization-type/Makefile =================================================================== --- /dev/null +++ lldb/test/API/lang/cpp/template-specialization-type/Makefile @@ -0,0 +1,3 @@ +CXX_SOURCES := main.cpp + +include Makefile.rules Index: lldb/test/API/lang/cpp/template-specialization-type/TestTemplateSpecializationType.py =================================================================== --- /dev/null +++ lldb/test/API/lang/cpp/template-specialization-type/TestTemplateSpecializationType.py @@ -0,0 +1,30 @@ +""" +Test value with a template specialization type. +""" +import lldb +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil + + +class TemplateSpecializationTypeTestCase(TestBase): + + mydir = TestBase.compute_mydir(__file__) + + def test_template_specialization_cast_children(self): + self.build() + lldbutil.run_to_source_breakpoint(self, '// break here', + lldb.SBFileSpec("main.cpp", False)) + + v = self.frame().EvaluateExpression("t") + self.assertEquals(2, v.GetNumChildren()) + self.assertEquals("42", v.GetChildAtIndex(0).GetValue()) + self.assertEquals("21", v.GetChildAtIndex(1).GetValue()) + + # Test a value of the TemplateSpecialization type. We turn + # RecordType into TemplateSpecializationType by casting and + # dereferencing a pointer to a record. + v = self.frame().EvaluateExpression("*((TestObj*)&t)") + self.assertEquals(2, v.GetNumChildren()) + self.assertEquals("42", v.GetChildAtIndex(0).GetValue()) + self.assertEquals("21", v.GetChildAtIndex(1).GetValue()) Index: lldb/test/API/lang/cpp/template-specialization-type/main.cpp =================================================================== --- /dev/null +++ lldb/test/API/lang/cpp/template-specialization-type/main.cpp @@ -0,0 +1,9 @@ +template struct TestObj { + int f; + T g; +}; + +int main() { + TestObj t{42, 21}; + return t.f + t.g; // break here +}