]> granicus.if.org Git - clang/commitdiff
Call setMustBuildLookupTable on TagDecls in ExternalASTMerger
authorLang Hames <lhames@gmail.com>
Sat, 17 Jun 2017 00:12:38 +0000 (00:12 +0000)
committerLang Hames <lhames@gmail.com>
Sat, 17 Jun 2017 00:12:38 +0000 (00:12 +0000)
Summary:
setMustBuildLookupTable should be called on imported TagDecls otherwise we may fail
to import their member decls (if they have any).

Not calling the setMustBuildLookupTable method results in a failure in the attached test
case when lookup for the 'x' member fails on struct S, which hasn't had its decls imported
elsewhere. (By contrast the member-in-struct testcase hasn't run into this issue
because the import of its decls is triggered when the struct instance is defined, and the
member access follows this).

Reviewers: spyffe, rsmith

Reviewed By: spyffe, rsmith

Differential Revision: https://reviews.llvm.org/D34253

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@305619 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ExternalASTMerger.cpp
test/Import/indirect-struct-member-access/Inputs/S.c [new file with mode: 0644]
test/Import/indirect-struct-member-access/test.c [new file with mode: 0644]

index 1dc472a5f7534f71f9110cc8eab51eb873783194..b746edaf643991a5668d7e4ba2220aa8e18a36b0 100644 (file)
@@ -41,6 +41,7 @@ public:
   Decl *Imported(Decl *From, Decl *To) override {
     if (auto ToTag = dyn_cast<TagDecl>(To)) {
       ToTag->setHasExternalLexicalStorage();
+      ToTag->setMustBuildLookupTable();
     } else if (auto ToNamespace = dyn_cast<NamespaceDecl>(To)) {
       ToNamespace->setHasExternalVisibleStorage();
     }
diff --git a/test/Import/indirect-struct-member-access/Inputs/S.c b/test/Import/indirect-struct-member-access/Inputs/S.c
new file mode 100644 (file)
index 0000000..b0876d2
--- /dev/null
@@ -0,0 +1,3 @@
+struct S {
+  int a;
+};
diff --git a/test/Import/indirect-struct-member-access/test.c b/test/Import/indirect-struct-member-access/test.c
new file mode 100644 (file)
index 0000000..cbf7e65
--- /dev/null
@@ -0,0 +1,4 @@
+// RUN: clang-import-test -import %S/Inputs/S.c -expression %s
+void expr(struct S *MyS) {
+  MyS->a = 3;
+}