From: Axel Naumann Date: Tue, 2 Oct 2012 12:18:46 +0000 (+0000) Subject: Only those InterestingDecls that got added to the AST should be passed to the ASTCons... X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d9a25b3c1782783d991fe2a3627f1cf42c968115;p=platform%2Fupstream%2Fllvm.git Only those InterestingDecls that got added to the AST should be passed to the ASTConsumer. llvm-svn: 165001 --- diff --git a/clang/include/clang/Serialization/ASTReader.h b/clang/include/clang/Serialization/ASTReader.h index e87c93f..a3abce1 100644 --- a/clang/include/clang/Serialization/ASTReader.h +++ b/clang/include/clang/Serialization/ASTReader.h @@ -687,6 +687,12 @@ private: /// Objective-C protocols. std::deque InterestingDecls; + /// \brief Redecls that have been added to the AST + /// + /// Redecls that are deserialized but not in RedeclsAddedToAST must + /// not be passed to the ASTConsumers, even if they are InterestignDecls. + llvm::SmallPtrSet RedeclsAddedToAST; + /// \brief The set of redeclarable declarations that have been deserialized /// since the last time the declaration chains were linked. llvm::SmallPtrSet RedeclsDeserialized; diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index a897d86..c5153b5 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -6509,4 +6509,5 @@ ASTReader::~ASTReader() { J != F; ++J) delete J->first; } + assert(RedeclsAddedToAST.empty() && "RedeclsAddedToAST not empty!"); } diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp index 85740de..e770c06 100644 --- a/clang/lib/Serialization/ASTReaderDecl.cpp +++ b/clang/lib/Serialization/ASTReaderDecl.cpp @@ -1777,9 +1777,11 @@ ASTDeclReader::FindExistingResult::~FindExistingResult() { DeclContext *DC = New->getDeclContext()->getRedeclContext(); if (DC->isTranslationUnit() && Reader.SemaObj) { - Reader.SemaObj->IdResolver.tryAddTopLevelDecl(New, New->getDeclName()); + if (Reader.SemaObj->IdResolver.tryAddTopLevelDecl(New, New->getDeclName())) + Reader.RedeclsAddedToAST.insert(New); } else if (DC->isNamespace()) { DC->addDecl(New); + Reader.RedeclsAddedToAST.insert(New); } } @@ -2154,7 +2156,13 @@ Decl *ASTReader::ReadDeclRecord(DeclID ID) { // AST consumer might need to know about, queue it. // We don't pass it to the consumer immediately because we may be in recursive // loading, and some declarations may still be initializing. - if (isConsumerInterestedIn(D)) + if (getContext().getLangOpts().Modules) { + if (RedeclsAddedToAST.count(D)) { + RedeclsAddedToAST.erase(D); + if (isConsumerInterestedIn(D)) + InterestingDecls.push_back(D); + } + } else if (isConsumerInterestedIn(D)) InterestingDecls.push_back(D); return D; diff --git a/clang/test/Modules/Inputs/templates-left.h b/clang/test/Modules/Inputs/templates-left.h index 7f50cd4..57a8c85 100644 --- a/clang/test/Modules/Inputs/templates-left.h +++ b/clang/test/Modules/Inputs/templates-left.h @@ -20,8 +20,10 @@ namespace N { } template -void pendingInstantiation(T) {} +void pendingInstantiationEmit(T) {} void triggerPendingInstantiation() { - pendingInstantiation(12); - pendingInstantiation(42.); + pendingInstantiationEmit(12); + pendingInstantiationEmit(42.); } + +void redeclDefinitionEmit(){} diff --git a/clang/test/Modules/Inputs/templates-right.h b/clang/test/Modules/Inputs/templates-right.h index f5487fb..4ef4a32 100644 --- a/clang/test/Modules/Inputs/templates-right.h +++ b/clang/test/Modules/Inputs/templates-right.h @@ -19,7 +19,9 @@ namespace N { } template -void pendingInstantiation(T) {} +void pendingInstantiationEmit(T) {} void triggerPendingInstantiationToo() { - pendingInstantiation(12); + pendingInstantiationEmit(12); } + +void redeclDefinitionEmit(){} diff --git a/clang/test/Modules/templates.mm b/clang/test/Modules/templates.mm index a9b4591..e2d762c 100644 --- a/clang/test/Modules/templates.mm +++ b/clang/test/Modules/templates.mm @@ -1,6 +1,6 @@ // RUN: rm -rf %t // RUN: %clang_cc1 -x objective-c++ -fmodules -fmodule-cache-path %t -I %S/Inputs -verify %s -Wno-objc-root-class -// RUN: %clang_cc1 -x objective-c++ -fmodules -fmodule-cache-path %t -I %S/Inputs -emit-llvm %s -o - -Wno-objc-root-class | grep pendingInstantiation | FileCheck %s +// RUN: %clang_cc1 -x objective-c++ -fmodules -fmodule-cache-path %t -I %S/Inputs -emit-llvm %s -o - -Wno-objc-root-class | grep Emit | FileCheck %s @__experimental_modules_import templates_left; @__experimental_modules_import templates_right; @@ -18,11 +18,18 @@ void testTemplateClasses() { } void testPendingInstantiations() { - // CHECK: call - // CHECK: call - // CHECK: {{define .*pendingInstantiation.*[(]i}} - // CHECK: {{define .*pendingInstantiation.*[(]double}} - // CHECK: call + // CHECK: call {{.*pendingInstantiationEmit}} + // CHECK: call {{.*pendingInstantiationEmit}} + // CHECK: define {{.*pendingInstantiationEmit.*[(]i}} + // CHECK: define {{.*pendingInstantiationEmit.*[(]double}} triggerPendingInstantiation(); triggerPendingInstantiationToo(); } + +void testRedeclDefinition() { + // CHECK: define {{.*redeclDefinitionEmit}} + redeclDefinitionEmit(); +} + +// CHECK: call {{.*pendingInstantiation}} +// CHECK: call {{.*redeclDefinitionEmit}}