summaryrefslogtreecommitdiffstats
path: root/clang/Sema
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2007-08-28 05:27:00 +0000
committerChris Lattner <sabre@nondot.org>2007-08-28 05:27:00 +0000
commitbf478cbef2cd925448ccf5ecfdd6f00fa8b5fde4 (patch)
treefe199805ee325fe2ecc890642abc20861b28554b /clang/Sema
parent43318839c91e2f859080ff32ee42c9e7c51cd1dd (diff)
downloadbcm5719-llvm-bf478cbef2cd925448ccf5ecfdd6f00fa8b5fde4.tar.gz
bcm5719-llvm-bf478cbef2cd925448ccf5ecfdd6f00fa8b5fde4.zip
add a diagnostic:
t.c:1:12: warning: ISO C restricts enumerator values to range of 'int' (180388626432 is too large) enum e {A, B = 42LL << 32, C = -4, D = 12456 }; ^ llvm-svn: 41530
Diffstat (limited to 'clang/Sema')
-rw-r--r--clang/Sema/SemaDecl.cpp14
1 files changed, 14 insertions, 0 deletions
diff --git a/clang/Sema/SemaDecl.cpp b/clang/Sema/SemaDecl.cpp
index 5ab40ec28ff..301813bb187 100644
--- a/clang/Sema/SemaDecl.cpp
+++ b/clang/Sema/SemaDecl.cpp
@@ -987,6 +987,7 @@ void Sema::ParseEnumBody(SourceLocation EnumLoc, DeclTy *EnumDeclX,
// 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.
+ unsigned IntWidth = Context.getTypeSize(Context.IntTy, Enum->getLocation());
// Verify that all the values are okay, and reverse the list.
@@ -995,6 +996,19 @@ void Sema::ParseEnumBody(SourceLocation EnumLoc, DeclTy *EnumDeclX,
EnumConstantDecl *ECD =
cast_or_null<EnumConstantDecl>(static_cast<Decl*>(Elements[i]));
if (!ECD) continue; // Already issued a diagnostic.
+
+ // If the enum value doesn't fit in an int, emit an extension warning.
+ assert(ECD->getInitVal().getBitWidth() >= IntWidth &&
+ "Should have promoted value to int");
+ const llvm::APSInt &InitVal = ECD->getInitVal();
+ if (InitVal.getBitWidth() > IntWidth) {
+ llvm::APSInt V(InitVal);
+ V.trunc(IntWidth);
+ V.extend(InitVal.getBitWidth());
+ if (V != InitVal)
+ Diag(ECD->getLocation(), diag::ext_enum_value_not_int,
+ InitVal.toString());
+ }
ECD->setNextDeclarator(EltList);
EltList = ECD;
OpenPOWER on IntegriCloud