aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaDecl.cpp
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2009-12-11 01:34:50 +0000
committerEli Friedman <eli.friedman@gmail.com>2009-12-11 01:34:50 +0000
commited0716b7b79d8cdef34f3bd35776a91aa3c943e5 (patch)
tree13b959369d1879d76e0c5900bf0128b4efea01ee /lib/Sema/SemaDecl.cpp
parentd6baec80f2e7763bbcc9aefd7eaa1580223b1389 (diff)
Fix the handling of dependent enums per C++ DR 502.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@91089 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaDecl.cpp')
-rw-r--r--lib/Sema/SemaDecl.cpp22
1 files changed, 18 insertions, 4 deletions
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp
index fa0d3cef65..64305b443e 100644
--- a/lib/Sema/SemaDecl.cpp
+++ b/lib/Sema/SemaDecl.cpp
@@ -5663,7 +5663,7 @@ EnumConstantDecl *Sema::CheckEnumConstant(EnumDecl *Enum,
llvm::APSInt EnumVal(32);
QualType EltTy;
if (Val) {
- if (Val->isTypeDependent())
+ if (Enum->isDependentType())
EltTy = Context.DependentTy;
else {
// Make sure to promote the operand type to int.
@@ -5675,8 +5675,7 @@ EnumConstantDecl *Sema::CheckEnumConstant(EnumDecl *Enum,
// C99 6.7.2.2p2: Make sure we have an integer constant expression.
SourceLocation ExpLoc;
- if (!Val->isValueDependent() &&
- VerifyIntegerConstantExpression(Val, &EnumVal)) {
+ if (VerifyIntegerConstantExpression(Val, &EnumVal)) {
Val = 0;
} else {
EltTy = Val->getType();
@@ -5685,7 +5684,9 @@ EnumConstantDecl *Sema::CheckEnumConstant(EnumDecl *Enum,
}
if (!Val) {
- if (LastEnumConst) {
+ if (Enum->isDependentType())
+ EltTy = Context.DependentTy;
+ else if (LastEnumConst) {
// Assign the last value + 1.
EnumVal = LastEnumConst->getInitVal();
++EnumVal;
@@ -5771,6 +5772,19 @@ void Sema::ActOnEnumBody(SourceLocation EnumLoc, SourceLocation LBraceLoc,
if (Attr)
ProcessDeclAttributeList(S, Enum, Attr);
+ if (Enum->isDependentType()) {
+ for (unsigned i = 0; i != NumElements; ++i) {
+ EnumConstantDecl *ECD =
+ cast_or_null<EnumConstantDecl>(Elements[i].getAs<Decl>());
+ if (!ECD) continue;
+
+ ECD->setType(EnumType);
+ }
+
+ Enum->completeDefinition(Context, Context.DependentTy, Context.DependentTy);
+ return;
+ }
+
// TODO: If the result value doesn't fit in an int, it must be a long or long
// long value. ISO C does not support this, but GCC does as an extension,
// emit a warning.