PR33924: Merge block-scope anonymous declarations if there are multiple definitions...
authorRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 5 Oct 2017 00:47:24 +0000 (00:47 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 5 Oct 2017 00:47:24 +0000 (00:47 +0000)
llvm-svn: 314956

clang/lib/Serialization/ASTCommon.cpp
clang/lib/Serialization/ASTReaderDecl.cpp

index 9c6f03cd0bb7d9027b3c3d9852d6bbadf7f49a3a..7519dc239c089d725988ad57b579df21f1e83877 100644 (file)
@@ -344,8 +344,8 @@ bool serialization::needsAnonymousDeclarationNumber(const NamedDecl *D) {
     return true;
   }
 
-  // Otherwise, we only care about anonymous class members.
-  if (D->getDeclName() || !isa<CXXRecordDecl>(D->getLexicalDeclContext()))
+  // Otherwise, we only care about anonymous class members / block-scope decls.
+  if (D->getDeclName() || D->getLexicalDeclContext()->isFileContext())
     return false;
   return isa<TagDecl>(D) || isa<FieldDecl>(D);
 }
index 57f509ea6f694430e9ea61dd87b3a5451826345d..118417c930511ef773020dc9de32990f7855c5cd 100644 (file)
@@ -467,6 +467,7 @@ FunctionDecl *ASTDeclReader::TryRegisterAsFunctionDefinition(FunctionDecl *D) {
     // declaration.
     if (Definition != D) {
       // Already have a different definition, merge this one into it.
+      Reader.MergedDeclContexts.insert(std::make_pair(D, Definition));
       Reader.mergeDefinitionVisibility(Definition, D);
     }
     return Definition;