diff options
Diffstat (limited to 'lib/AST/DeclBase.cpp')
-rw-r--r-- | lib/AST/DeclBase.cpp | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/lib/AST/DeclBase.cpp b/lib/AST/DeclBase.cpp index 8b1acb1996..cb5846fc83 100644 --- a/lib/AST/DeclBase.cpp +++ b/lib/AST/DeclBase.cpp @@ -841,6 +841,22 @@ DeclContext::LoadLexicalDeclsFromExternalStorage() const { // Notify that we have a DeclContext that is initializing. ExternalASTSource::Deserializing ADeclContext(Source); + // We may have already loaded just the fields of this record, in which case + // we remove all of the fields from the list. The fields will be reloaded + // from the external source as part of re-establishing the context. + if (const RecordDecl *RD = dyn_cast<RecordDecl>(this)) { + if (RD->LoadedFieldsFromExternalStorage) { + while (FirstDecl && isa<FieldDecl>(FirstDecl)) { + Decl *Next = FirstDecl->NextDeclInContext; + FirstDecl->NextDeclInContext = 0; + FirstDecl = Next; + } + + if (!FirstDecl) + LastDecl = 0; + } + } + // Load the external declarations, if any. SmallVector<Decl*, 64> Decls; ExternalLexicalStorage = false; @@ -856,14 +872,6 @@ DeclContext::LoadLexicalDeclsFromExternalStorage() const { if (Decls.empty()) return; - // We may have already loaded just the fields of this record, in which case - // don't add the decls, just replace the FirstDecl/LastDecl chain. - if (const RecordDecl *RD = dyn_cast<RecordDecl>(this)) - if (RD->LoadedFieldsFromExternalStorage) { - llvm::tie(FirstDecl, LastDecl) = BuildDeclChain(Decls); - return; - } - // Splice the newly-read declarations into the beginning of the list // of declarations. Decl *ExternalFirst, *ExternalLast; |