Add support for remembering origins to ExternalASTMerger
authorSean Callanan <scallanan@apple.com>
Wed, 27 Sep 2017 19:57:58 +0000 (19:57 +0000)
committerSean Callanan <scallanan@apple.com>
Wed, 27 Sep 2017 19:57:58 +0000 (19:57 +0000)
commit967d438439ac23afe4f6c684a27ac15daff11872
tree7a1a690d814f673f0062ab07d2bb283bbd543cd3
parentdee2cf67eafd0313a5f0f163b9cbe6c71228ae34
Add support for remembering origins to ExternalASTMerger

ExternalASTMerger has hitherto relied on being able to look up
any Decl through its named DeclContext chain. This works for
many cases, but causes problems for function-local structs,
which cannot be looked up in their containing FunctionDecl. An
example case is

void f() {
  { struct S { int a; }; }
  { struct S { bool b; }; }
}

It is not possible to lookup either of the two Ses individually
(or even to provide enough information to disambiguate) after
parsing is over; and there is typically no need to, since they
are invisible to the outside world.

However, ExternalASTMerger needs to be able to complete either
S on demand. This led to an XFAIL on test/Import/local-struct,
which this patch removes. The way the patch works is:

It defines a new data structure, ExternalASTMerger::OriginMap,
which clients are expected to maintain (default-constructing
if the origin does not have an ExternalASTMerger servicing it)
As DeclContexts are imported, if they cannot be looked up by
name they are placed in the OriginMap. This allows
ExternalASTMerger to complete them later if necessary.
As DeclContexts are imported from an origin that already has
its own OriginMap, the origins are forwarded – but only for
those DeclContexts that are actually used. This keeps the
amount of stored data minimal.

The patch also applies several improvements from review:

- Thoroughly documents the interface to ExternalASTMerger;
- Adds optional logging to help track what's going on; and
- Cleans up a bunch of braces and dangling elses.

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

llvm-svn: 314336
22 files changed:
clang/include/clang/AST/ExternalASTMerger.h
clang/lib/AST/ExternalASTMerger.cpp
clang/lib/Sema/SemaType.cpp
clang/test/Import/extern-c-function/Inputs/F.cpp [new file with mode: 0644]
clang/test/Import/extern-c-function/test.cpp [new file with mode: 0644]
clang/test/Import/forward-declared-objc-class/Inputs/S1.m [new file with mode: 0644]
clang/test/Import/forward-declared-objc-class/Inputs/S2.m [new file with mode: 0644]
clang/test/Import/forward-declared-objc-class/Inputs/S3.m [new file with mode: 0644]
clang/test/Import/forward-declared-objc-class/test.m [new file with mode: 0644]
clang/test/Import/forward-declared-struct/Inputs/S3.c [new file with mode: 0644]
clang/test/Import/forward-declared-struct/test.c
clang/test/Import/local-struct-use-origins/Inputs/Callee.cpp [new file with mode: 0644]
clang/test/Import/local-struct-use-origins/test.cpp [new file with mode: 0644]
clang/test/Import/local-struct/test.cpp
clang/test/Import/objc-definitions-in-expression/Inputs/S.m [new file with mode: 0644]
clang/test/Import/objc-definitions-in-expression/test.m [new file with mode: 0644]
clang/test/Import/struct-and-var/Inputs/S1.cpp [new file with mode: 0644]
clang/test/Import/struct-and-var/Inputs/S2.cpp [new file with mode: 0644]
clang/test/Import/struct-and-var/test.cpp [new file with mode: 0644]
clang/test/Import/template/Inputs/T.cpp [new file with mode: 0644]
clang/test/Import/template/test.cpp [new file with mode: 0644]
clang/tools/clang-import-test/clang-import-test.cpp