summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-08-26 21:23:06 +0000
committerDouglas Gregor <dgregor@apple.com>2011-08-26 21:23:06 +0000
commitf337ae9477c79788c76e896e65da316d6f987887 (patch)
treec313781c09c1d671e0481209d36772458e6267ff /clang/lib
parent5e5704277f1c43c3aa6c44c7c52e1daf71a9c16f (diff)
downloadbcm5719-llvm-f337ae9477c79788c76e896e65da316d6f987887.tar.gz
bcm5719-llvm-f337ae9477c79788c76e896e65da316d6f987887.zip
When we're deserializing declarations lexically stored in a RecordDecl
after having already deserialized the fields, clear out the fields first. This makes sure that we keep all of the declarations in the lexical context (including those implicitly added by later type-checking) within the same list. A test case for this behavior is coming as part of another commit; testing for this problem in isolation is a nightmare. llvm-svn: 138661
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/AST/DeclBase.cpp24
1 files changed, 16 insertions, 8 deletions
diff --git a/clang/lib/AST/DeclBase.cpp b/clang/lib/AST/DeclBase.cpp
index 8b1acb19964..cb5846fc838 100644
--- a/clang/lib/AST/DeclBase.cpp
+++ b/clang/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;
OpenPOWER on IntegriCloud