4adb2dd Merging r296656:

Authored and Committed by Hans Wennborg 7 years ago
    Merging r296656:
    ------------------------------------------------------------------------
    r296656 | bruno | 2017-03-01 11:18:42 -0800 (Wed, 01 Mar 2017) | 34 lines
    
    [PCH] Avoid VarDecl emission attempt if no owning module avaiable
    
    This is a stopgap fix for PR31863, a regression introduced in r276159.
    
    Consider this snippet:
    
    struct FVector;
    struct FVector {};
    struct FBox {
      FVector Min;
      FBox(int);
    };
    namespace {
    FBox InvalidBoundingBox(0);
    }
    
    While parsing the DECL_VAR for 'struct FBox', clang recursively read all the
    dep decls until it finds the DECL_CXX_RECORD forward declaration for 'struct
    FVector'. Then, it resumes all the way up back to DECL_VAR handling in
    `ReadDeclRecord`, where it checks if `isConsumerInterestedIn` for the decl.
    
    One of the condition for `isConsumerInterestedIn` to return false is if the
    VarDecl is imported from a module `D->getImportedOwningModule()`, because it
    will get emitted when we import the relevant module. However, before checking
    if it comes from a module, clang checks if `Ctx.DeclMustBeEmitted(D)`, which
    triggers the emission of 'struct FBox'. Since one of its fields is still
    incomplete, it crashes.
    
    Instead, check if `D->getImportedOwningModule()` is true before calling
    `Ctx.DeclMustBeEmitted(D)`.
    
    Differential Revision: https://reviews.llvm.org/D29753
    
    rdar://problem/30173654
    ------------------------------------------------------------------------
    
    llvm-svn: 296762