jarin created this revision.
jarin added a reviewer: teemperor.
jarin added a project: LLDB.
Herald added a subscriber: lldb-commits.

Template specializations are not handled in many of the
TypeSystemClang methods. For example, GetNumChildren does not handle
the TemplateSpecialization type class, so template specializations
always look like empty objects.

This patch just desugars template specialization in the existing
RemoveWrappingTypes desugaring helper.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D83858

Files:
  lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
  lldb/test/API/lang/cpp/template-specialization/Makefile
  lldb/test/API/lang/cpp/template-specialization/TestTemplateSpecialization.py
  lldb/test/API/lang/cpp/template-specialization/main.cpp


Index: lldb/test/API/lang/cpp/template-specialization/main.cpp
===================================================================
--- /dev/null
+++ lldb/test/API/lang/cpp/template-specialization/main.cpp
@@ -0,0 +1,9 @@
+template <typename T> struct TestObj {
+  int f;
+  T g;
+};
+
+int main() {
+  TestObj<int> t{42, 21};
+  return t.f + t.g; // break here
+}
Index: 
lldb/test/API/lang/cpp/template-specialization/TestTemplateSpecialization.py
===================================================================
--- /dev/null
+++ lldb/test/API/lang/cpp/template-specialization/TestTemplateSpecialization.py
@@ -0,0 +1,28 @@
+"""
+Test evaluating an expression with a cast to a pointer to a template
+specialization.
+"""
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+
+class TemplateSpecializationTestCase(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())
+
+        v = self.frame().EvaluateExpression("*((TestObj<int>*)&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/Makefile
===================================================================
--- /dev/null
+++ lldb/test/API/lang/cpp/template-specialization/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
@@ -2504,6 +2504,7 @@
     case clang::Type::Typedef:
     case clang::Type::TypeOf:
     case clang::Type::TypeOfExpr:
+    case clang::Type::TemplateSpecialization:
       type = type->getLocallyUnqualifiedSingleStepDesugaredType();
       break;
     default:


Index: lldb/test/API/lang/cpp/template-specialization/main.cpp
===================================================================
--- /dev/null
+++ lldb/test/API/lang/cpp/template-specialization/main.cpp
@@ -0,0 +1,9 @@
+template <typename T> struct TestObj {
+  int f;
+  T g;
+};
+
+int main() {
+  TestObj<int> t{42, 21};
+  return t.f + t.g; // break here
+}
Index: lldb/test/API/lang/cpp/template-specialization/TestTemplateSpecialization.py
===================================================================
--- /dev/null
+++ lldb/test/API/lang/cpp/template-specialization/TestTemplateSpecialization.py
@@ -0,0 +1,28 @@
+"""
+Test evaluating an expression with a cast to a pointer to a template
+specialization.
+"""
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+
+class TemplateSpecializationTestCase(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())
+
+        v = self.frame().EvaluateExpression("*((TestObj<int>*)&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/Makefile
===================================================================
--- /dev/null
+++ lldb/test/API/lang/cpp/template-specialization/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
@@ -2504,6 +2504,7 @@
     case clang::Type::Typedef:
     case clang::Type::TypeOf:
     case clang::Type::TypeOfExpr:
+    case clang::Type::TemplateSpecialization:
       type = type->getLocallyUnqualifiedSingleStepDesugaredType();
       break;
     default:
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to