summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-03-01 19:00:07 +0000
committerDouglas Gregor <dgregor@apple.com>2010-03-01 19:00:07 +0000
commitaff9c1a03353d09cf9ad97e98e1a952c48cba941 (patch)
tree8ef02ed5313c2607b491c139261eaa687cbd36c6 /clang/lib/Sema
parent12b02282d923f8d8f04d60ae0b943fd263d28fdb (diff)
downloadbcm5719-llvm-aff9c1a03353d09cf9ad97e98e1a952c48cba941.tar.gz
bcm5719-llvm-aff9c1a03353d09cf9ad97e98e1a952c48cba941.zip
When instantiating a function-scoped enum, make sure that it and its
enumeration constants get placed into the local instantiation hash table. Fixes PR6375. llvm-svn: 97471
Diffstat (limited to 'clang/lib/Sema')
-rw-r--r--clang/lib/Sema/Sema.h2
-rw-r--r--clang/lib/Sema/SemaTemplateInstantiateDecl.cpp9
2 files changed, 10 insertions, 1 deletions
diff --git a/clang/lib/Sema/Sema.h b/clang/lib/Sema/Sema.h
index da192dd8879..4d017cada33 100644
--- a/clang/lib/Sema/Sema.h
+++ b/clang/lib/Sema/Sema.h
@@ -3433,7 +3433,7 @@ public:
void InstantiatedLocal(const Decl *D, Decl *Inst) {
Decl *&Stored = LocalDecls[D];
- assert(!Stored && "Already instantiated this local");
+ assert((!Stored || Stored == Inst) && "Already instantiated this local");
Stored = Inst;
}
};
diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
index 0f7bae835fd..292820b821c 100644
--- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
+++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
@@ -491,6 +491,9 @@ Decl *TemplateDeclInstantiator::VisitEnumDecl(EnumDecl *D) {
Owner->addDecl(Enum);
Enum->startDefinition();
+ if (D->getDeclContext()->isFunctionOrMethod())
+ SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Enum);
+
llvm::SmallVector<Sema::DeclPtrTy, 4> Enumerators;
EnumConstantDecl *LastEnumConst = 0;
@@ -530,6 +533,12 @@ Decl *TemplateDeclInstantiator::VisitEnumDecl(EnumDecl *D) {
Enum->addDecl(EnumConst);
Enumerators.push_back(Sema::DeclPtrTy::make(EnumConst));
LastEnumConst = EnumConst;
+
+ if (D->getDeclContext()->isFunctionOrMethod()) {
+ // If the enumeration is within a function or method, record the enum
+ // constant as a local.
+ SemaRef.CurrentInstantiationScope->InstantiatedLocal(*EC, EnumConst);
+ }
}
}
OpenPOWER on IntegriCloud