зеркало из https://github.com/microsoft/clang-1.git
Only those InterestingDecls that got added to the AST should be passed to the ASTConsumer.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@165001 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
f88cd53676
Коммит
38c3bb40c2
|
@ -687,6 +687,12 @@ private:
|
|||
/// Objective-C protocols.
|
||||
std::deque<Decl *> 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<Decl *, 16> RedeclsAddedToAST;
|
||||
|
||||
/// \brief The set of redeclarable declarations that have been deserialized
|
||||
/// since the last time the declaration chains were linked.
|
||||
llvm::SmallPtrSet<Decl *, 16> RedeclsDeserialized;
|
||||
|
|
|
@ -6509,4 +6509,5 @@ ASTReader::~ASTReader() {
|
|||
J != F; ++J)
|
||||
delete J->first;
|
||||
}
|
||||
assert(RedeclsAddedToAST.empty() && "RedeclsAddedToAST not empty!");
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -20,8 +20,10 @@ namespace N {
|
|||
}
|
||||
|
||||
template <typename T>
|
||||
void pendingInstantiation(T) {}
|
||||
void pendingInstantiationEmit(T) {}
|
||||
void triggerPendingInstantiation() {
|
||||
pendingInstantiation(12);
|
||||
pendingInstantiation(42.);
|
||||
pendingInstantiationEmit(12);
|
||||
pendingInstantiationEmit(42.);
|
||||
}
|
||||
|
||||
void redeclDefinitionEmit(){}
|
||||
|
|
|
@ -19,7 +19,9 @@ namespace N {
|
|||
}
|
||||
|
||||
template <typename T>
|
||||
void pendingInstantiation(T) {}
|
||||
void pendingInstantiationEmit(T) {}
|
||||
void triggerPendingInstantiationToo() {
|
||||
pendingInstantiation(12);
|
||||
pendingInstantiationEmit(12);
|
||||
}
|
||||
|
||||
void redeclDefinitionEmit(){}
|
||||
|
|
|
@ -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}}
|
||||
|
|
Загрузка…
Ссылка в новой задаче