Skip to content
Snippets Groups Projects
  • Sean Callanan's avatar
    87d985ae
    Add support for remembering origins to ExternalASTMerger · 87d985ae
    Sean Callanan authored
    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
    
    
    git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@314336 91177308-0d34-0410-b5e6-96231b3b80d8
    87d985ae
    History
    Add support for remembering origins to ExternalASTMerger
    Sean Callanan authored
    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
    
    
    git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@314336 91177308-0d34-0410-b5e6-96231b3b80d8
Code owners
Assign users and groups as approvers for specific file changes. Learn more.