aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaDecl.cpp
diff options
context:
space:
mode:
authorSteve Naroff <snaroff@apple.com>2008-08-07 14:08:16 +0000
committerSteve Naroff <snaroff@apple.com>2008-08-07 14:08:16 +0000
commit02408c67c404267a23ee1e1ab23344fc4b1bff17 (patch)
tree4f8415f64a1228b5b87afe935c459abddaef9d27 /lib/Sema/SemaDecl.cpp
parent356b63a6668d8b010b53921941576189ee4bd459 (diff)
Sema::ActOnEnumBody(): handle nested enum redefinitions.
Fixes <rdar://problem/6093889> Nested enum redefinition crashes sema. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@54463 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaDecl.cpp')
-rw-r--r--lib/Sema/SemaDecl.cpp14
1 files changed, 13 insertions, 1 deletions
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp
index b513dde466..61e29de8d4 100644
--- a/lib/Sema/SemaDecl.cpp
+++ b/lib/Sema/SemaDecl.cpp
@@ -2223,11 +2223,23 @@ Sema::DeclTy *Sema::ActOnEnumConstant(Scope *S, DeclTy *theEnumDecl,
return New;
}
+// FIXME: For consistency with ActOnFields(), we should have the parser
+// pass in the source location for the left/right braces.
void Sema::ActOnEnumBody(SourceLocation EnumLoc, DeclTy *EnumDeclX,
DeclTy **Elements, unsigned NumElements) {
EnumDecl *Enum = cast<EnumDecl>(static_cast<Decl*>(EnumDeclX));
- assert(!Enum->isDefinition() && "Enum redefinitions can't reach here");
+ if (Enum && Enum->isDefinition()) {
+ // Diagnose code like:
+ // enum e0 {
+ // E0 = sizeof(enum e0 { E1 })
+ // };
+ Diag(Enum->getLocation(), diag::err_nested_redefinition,
+ Enum->getName());
+ Diag(EnumLoc, diag::err_previous_definition);
+ Enum->setInvalidDecl();
+ 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.