зеркало из https://github.com/microsoft/clang-1.git
When instantiating a function-scoped enum, make sure that it and its
enumeration constants get placed into the local instantiation hash table. Fixes PR6375. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97471 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
00225547b5
Коммит
96084f171f
|
@ -3433,7 +3433,7 @@ public:
|
||||||
|
|
||||||
void InstantiatedLocal(const Decl *D, Decl *Inst) {
|
void InstantiatedLocal(const Decl *D, Decl *Inst) {
|
||||||
Decl *&Stored = LocalDecls[D];
|
Decl *&Stored = LocalDecls[D];
|
||||||
assert(!Stored && "Already instantiated this local");
|
assert((!Stored || Stored == Inst) && "Already instantiated this local");
|
||||||
Stored = Inst;
|
Stored = Inst;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -491,6 +491,9 @@ Decl *TemplateDeclInstantiator::VisitEnumDecl(EnumDecl *D) {
|
||||||
Owner->addDecl(Enum);
|
Owner->addDecl(Enum);
|
||||||
Enum->startDefinition();
|
Enum->startDefinition();
|
||||||
|
|
||||||
|
if (D->getDeclContext()->isFunctionOrMethod())
|
||||||
|
SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Enum);
|
||||||
|
|
||||||
llvm::SmallVector<Sema::DeclPtrTy, 4> Enumerators;
|
llvm::SmallVector<Sema::DeclPtrTy, 4> Enumerators;
|
||||||
|
|
||||||
EnumConstantDecl *LastEnumConst = 0;
|
EnumConstantDecl *LastEnumConst = 0;
|
||||||
|
@ -530,6 +533,12 @@ Decl *TemplateDeclInstantiator::VisitEnumDecl(EnumDecl *D) {
|
||||||
Enum->addDecl(EnumConst);
|
Enum->addDecl(EnumConst);
|
||||||
Enumerators.push_back(Sema::DeclPtrTy::make(EnumConst));
|
Enumerators.push_back(Sema::DeclPtrTy::make(EnumConst));
|
||||||
LastEnumConst = 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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,3 +9,19 @@ struct adder {
|
||||||
};
|
};
|
||||||
|
|
||||||
int array1[adder<long, 3, 4>::value == 7? 1 : -1];
|
int array1[adder<long, 3, 4>::value == 7? 1 : -1];
|
||||||
|
|
||||||
|
namespace PR6375 {
|
||||||
|
template<typename T>
|
||||||
|
void f() {
|
||||||
|
enum Enum
|
||||||
|
{
|
||||||
|
enumerator1 = 0xFFFFFFF,
|
||||||
|
enumerator2 = enumerator1 - 1
|
||||||
|
};
|
||||||
|
|
||||||
|
int xb1 = enumerator1;
|
||||||
|
int xe1 = enumerator2;
|
||||||
|
}
|
||||||
|
|
||||||
|
template void f<int>();
|
||||||
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче