]> granicus.if.org Git - clang/commitdiff
When adding a visible decl, deserialize the visible decls and add it.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Sun, 4 Jul 2010 21:44:25 +0000 (21:44 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Sun, 4 Jul 2010 21:44:25 +0000 (21:44 +0000)
Before this commit, visible decls added before deserialization were ignored.
This was not an issue since name lookup (that usually comes before the addition) forces deserialization
but it is an issue for lazily declared class implicit members.

We can use a PCH'ed <string> now.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@107596 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/DeclBase.cpp

index 8020916a6ce6086508a168fcbd6c3289957d7bc8..7a104f4d5740acb14bd920bacbad6448cc5c8a9c 100644 (file)
@@ -947,9 +947,10 @@ void DeclContext::makeDeclVisibleInContext(NamedDecl *D, bool Recoverable) {
   }
 
   // If we already have a lookup data structure, perform the insertion
-  // into it. Otherwise, be lazy and don't build that structure until
-  // someone asks for it.
-  if (LookupPtr || !Recoverable)
+  // into it. If we haven't deserialized externally stored decls, deserialize
+  // them so we can add the decl. Otherwise, be lazy and don't build that
+  // structure until someone asks for it.
+  if (LookupPtr || !Recoverable || hasExternalVisibleStorage())
     makeDeclVisibleInContextImpl(D);
 
   // If we are a transparent context, insert into our parent context,
@@ -969,18 +970,18 @@ void DeclContext::makeDeclVisibleInContextImpl(NamedDecl *D) {
   if (isa<ClassTemplateSpecializationDecl>(D))
     return;
 
-  ASTContext *C = 0;
-  if (!LookupPtr) {
-    C = &getParentASTContext();
-    CreateStoredDeclsMap(*C);
-  }
-
   // If there is an external AST source, load any declarations it knows about
   // with this declaration's name.
   if (ExternalASTSource *Source = getParentASTContext().getExternalSource())
     if (hasExternalVisibleStorage())
       Source->FindExternalVisibleDeclsByName(this, D->getDeclName());
 
+  ASTContext *C = 0;
+  if (!LookupPtr) {
+    C = &getParentASTContext();
+    CreateStoredDeclsMap(*C);
+  }
+
   // Insert this declaration into the map.
   StoredDeclsList &DeclNameEntries = (*LookupPtr)[D->getDeclName()];
   if (DeclNameEntries.isNull()) {