Author: Pavel Labath Date: 2020-08-19T14:57:43+02:00 New Revision: d7363397c669f611e379988ea12fb428847fce61
URL: https://github.com/llvm/llvm-project/commit/d7363397c669f611e379988ea12fb428847fce61 DIFF: https://github.com/llvm/llvm-project/commit/d7363397c669f611e379988ea12fb428847fce61.diff LOG: [lldb] Add typedefs to the DeclContext they are created in 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 ast). This patch adds the typedef to the decl context it is created in. Differential Revision: https://reviews.llvm.org/D86140 Added: Modified: lldb/packages/Python/lldbsuite/test/lldbtest.py lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp lldb/test/API/lang/cpp/typedef/TestCppTypedef.py lldb/test/API/lang/cpp/typedef/main.cpp Removed: ################################################################################ diff --git a/lldb/packages/Python/lldbsuite/test/lldbtest.py b/lldb/packages/Python/lldbsuite/test/lldbtest.py index 724826de63fa..d8616ef35b0f 100644 --- a/lldb/packages/Python/lldbsuite/test/lldbtest.py +++ b/lldb/packages/Python/lldbsuite/test/lldbtest.py @@ -2538,6 +2538,7 @@ def expect_expr( 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.""" diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp index 608cdc25d072..d80d07574073 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -4495,6 +4495,7 @@ CompilerType TypeSystemClang::CreateTypedef( clang_ast, decl_ctx, clang::SourceLocation(), clang::SourceLocation(), &clang_ast.Idents.get(typedef_name), clang_ast.getTrivialTypeSourceInfo(qual_type)); + decl_ctx->addDecl(decl); SetOwningModule(decl, TypePayloadClang(payload).GetOwningModule()); clang::TagDecl *tdecl = nullptr; diff --git a/lldb/test/API/lang/cpp/typedef/TestCppTypedef.py b/lldb/test/API/lang/cpp/typedef/TestCppTypedef.py index 2aa2bcfe431a..35a2fba7ca9d 100644 --- a/lldb/test/API/lang/cpp/typedef/TestCppTypedef.py +++ b/lldb/test/API/lang/cpp/typedef/TestCppTypedef.py @@ -29,8 +29,16 @@ def test_typedef(self): # 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") diff --git a/lldb/test/API/lang/cpp/typedef/main.cpp b/lldb/test/API/lang/cpp/typedef/main.cpp index f1407b630a62..05757869ffec 100644 --- a/lldb/test/API/lang/cpp/typedef/main.cpp +++ b/lldb/test/API/lang/cpp/typedef/main.cpp @@ -7,7 +7,16 @@ struct S { 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 } _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits