[Lldb-commits] [PATCH] D86140: [lldb] Add typedefs to the DeclContext they are created in

Pavel Labath via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Tue Aug 18 07:06:05 PDT 2020

labath created this revision.
labath added reviewers: teemperor, shafik.
Herald added a project: LLDB.
labath requested review of this revision.
Herald added a subscriber: JDevlieghere.

TypeSystemClang::CreateTypedef was creating a typedef in the right
DeclContext, but it was not actually adding it as a child of the
context. The resulting inconsistent state meant that we would be unable
to reference the typedef from an expression directly, but we could use
them if they end up being pulled in by some previous subexpression
(because the ASTImporter will set up the correct links in the expression

This patch adds the typedef to the decl context it is created in.

  rG LLVM Github Monorepo



Index: lldb/test/API/lang/cpp/typedef/main.cpp
--- lldb/test/API/lang/cpp/typedef/main.cpp
+++ lldb/test/API/lang/cpp/typedef/main.cpp
@@ -7,7 +7,16 @@
 typedef S<float> SF;
+namespace ns {
+typedef S<float> SF;
+struct ST {
+  typedef S<float> SF;
 int main (int argc, char const *argv[]) {
   SF s{ .5 };
+  ns::SF in_ns;
+  ST::SF in_struct;
   return 0; // Set a breakpoint here
Index: lldb/test/API/lang/cpp/typedef/TestCppTypedef.py
--- lldb/test/API/lang/cpp/typedef/TestCppTypedef.py
+++ lldb/test/API/lang/cpp/typedef/TestCppTypedef.py
@@ -29,8 +29,16 @@
         # First of all, check that we can get a typedefed type correctly in a simple case
-        expr_result = frame.EvaluateExpression("(SF)s")
-        self.assertTrue(expr_result.IsValid(), "Expression failed with: " + str(expr_result.GetError()))
+        expr_result = self.expect_expr("(SF)s", result_children=[ValueCheck(value="0.5")])
+        self.expect_expr("(ns::SF)s", result_children=[ValueCheck(value="0.5")])
+        self.expect_expr("(ST::SF)s", result_children=[ValueCheck(value="0.5")])
+        self.filecheck("image dump ast a.out", __file__, "--strict-whitespace")
+# CHECK:      {{^}}|-TypedefDecl {{.*}} SF 'S<float>'
+# CHECK:      {{^}}|-NamespaceDecl {{.*}} ns
+# CHECK-NEXT: {{^}}| `-TypedefDecl {{.*}} SF 'S<float>'
+# CHECK:      {{^}}`-CXXRecordDecl {{.*}} struct ST definition
+# CHECK:      {{^}}  `-TypedefDecl {{.*}} SF 'S<float>'
         typedef_type = expr_result.GetType();
         self.assertTrue(typedef_type.IsValid(), "Can't get `SF` type of evaluated expression")
Index: lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
--- lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
+++ lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
@@ -4498,6 +4498,7 @@
         clang_ast, decl_ctx, clang::SourceLocation(), clang::SourceLocation(),
+    decl_ctx->addDecl(decl);
     SetOwningModule(decl, TypePayloadClang(payload).GetOwningModule());
     clang::TagDecl *tdecl = nullptr;
Index: lldb/packages/Python/lldbsuite/test/lldbtest.py
--- lldb/packages/Python/lldbsuite/test/lldbtest.py
+++ lldb/packages/Python/lldbsuite/test/lldbtest.py
@@ -2538,6 +2538,7 @@
         value_check = ValueCheck(type=result_type, value=result_value,
                                  summary=result_summary, children=result_children)
         value_check.check_value(self, eval_result, str(eval_result))
+        return eval_result
     def invoke(self, obj, name, trace=False):
         """Use reflection to call a method dynamically with no argument."""

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D86140.286276.patch
Type: text/x-patch
Size: 2968 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20200818/071cf318/attachment.bin>

More information about the lldb-commits mailing list