diff options
-rw-r--r-- | lib/Serialization/ASTReaderDecl.cpp | 32 | ||||
-rw-r--r-- | test/PCH/chain-empty-initial-namespace.cpp | 24 |
2 files changed, 42 insertions, 14 deletions
diff --git a/lib/Serialization/ASTReaderDecl.cpp b/lib/Serialization/ASTReaderDecl.cpp index 8190eabc00..4d2da8decb 100644 --- a/lib/Serialization/ASTReaderDecl.cpp +++ b/lib/Serialization/ASTReaderDecl.cpp @@ -1661,22 +1661,26 @@ Decl *ASTReader::ReadDeclRecord(unsigned Index, DeclID ID) { // so we need to make sure we insert in front. For all other contexts, // the vector is empty here anyway, so there's no loss in efficiency. Infos.insert(Infos.begin(), Info); + } - // Now add the pending visible updates for this decl context, if it has - // any. - DeclContextVisibleUpdatesPending::iterator I = - PendingVisibleUpdates.find(ID); - if (I != PendingVisibleUpdates.end()) { - DeclContextVisibleUpdates &U = I->second; - Info.LexicalDecls = 0; - Info.NumLexicalDecls = 0; - for (DeclContextVisibleUpdates::iterator UI = U.begin(), UE = U.end(); - UI != UE; ++UI) { - Info.NameLookupTableData = *UI; - Infos.push_back(Info); - } - PendingVisibleUpdates.erase(I); + // Now add the pending visible updates for this decl context, if it has any. + DeclContextVisibleUpdatesPending::iterator I = + PendingVisibleUpdates.find(ID); + if (I != PendingVisibleUpdates.end()) { + // There are updates. This means the context has external visible + // storage, even if the original stored version didn't. + DC->setHasExternalVisibleStorage(true); + DeclContextVisibleUpdates &U = I->second; + DeclContextInfos &Infos = DeclContextOffsets[DC]; + DeclContextInfo Info; + Info.LexicalDecls = 0; + Info.NumLexicalDecls = 0; + for (DeclContextVisibleUpdates::iterator UI = U.begin(), UE = U.end(); + UI != UE; ++UI) { + Info.NameLookupTableData = *UI; + Infos.push_back(Info); } + PendingVisibleUpdates.erase(I); } } assert(Idx == Record.size()); diff --git a/test/PCH/chain-empty-initial-namespace.cpp b/test/PCH/chain-empty-initial-namespace.cpp new file mode 100644 index 0000000000..bf15caa72c --- /dev/null +++ b/test/PCH/chain-empty-initial-namespace.cpp @@ -0,0 +1,24 @@ +// no PCH +// RUN: %clang_cc1 -include %s -include %s -fsyntax-only %s +// full PCH +// RUN: %clang_cc1 -chain-include %s -chain-include %s -fsyntax-only %s +#if !defined(PASS1) +#define PASS1 + +namespace foo {} // no external storage + +#elif !defined(PASS2) +#define PASS2 + +namespace foo { + void bar(); +} + +#else +// PASS3 + +void test() { + foo::bar(); // no-error +} + +#endif |