diff options
| author | Chris Lattner <sabre@nondot.org> | 2007-08-28 05:27:00 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2007-08-28 05:27:00 +0000 |
| commit | bf478cbef2cd925448ccf5ecfdd6f00fa8b5fde4 (patch) | |
| tree | fe199805ee325fe2ecc890642abc20861b28554b /clang/Sema | |
| parent | 43318839c91e2f859080ff32ee42c9e7c51cd1dd (diff) | |
| download | bcm5719-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.cpp | 14 |
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; |

