Use VerifyIntegerConstantExpression instead of isIntegerConstantExpr. Fixes PR2963

llvm-svn: 60591
This commit is contained in:
Anders Carlsson 2008-12-05 16:33:57 +00:00
parent af333378c9
commit 1aa679227b
3 changed files with 18 additions and 4 deletions

View File

@ -978,8 +978,6 @@ DIAG(err_redefinition_of_enumerator, ERROR,
"redefinition of enumerator %0")
DIAG(err_duplicate_member, ERROR,
"duplicate member %0")
DIAG(err_enum_value_not_integer_constant_expr, ERROR,
"enumerator value for %0 is not an integer constant")
DIAG(ext_enum_value_not_int, EXTENSION,
"ISO C restricts enumerator values to range of 'int' (%0 is too large)")
DIAG(warn_enum_too_large, WARNING,

View File

@ -2899,8 +2899,7 @@ Sema::DeclTy *Sema::ActOnEnumConstant(Scope *S, DeclTy *theEnumDecl,
// C99 6.7.2.2p2: Make sure we have an integer constant expression.
SourceLocation ExpLoc;
if (!Val->isIntegerConstantExpr(EnumVal, Context, &ExpLoc)) {
Diag(ExpLoc, diag::err_enum_value_not_integer_constant_expr) << Id;
if (VerifyIntegerConstantExpression(Val, &EnumVal)) {
delete Val;
Val = 0; // Just forget about it.
} else {

View File

@ -0,0 +1,17 @@
// RUN: clang %s -verify -pedantic -fsyntax-only
typedef short short_fixed;
enum
{
// 8.8 short_fixed
SHORT_FIXED_FRACTIONAL_BITS= 8,
SHORT_FIXED_ONE= 1<<SHORT_FIXED_FRACTIONAL_BITS
};
#define FLOAT_TO_SHORT_FIXED(f) ((short_fixed)((f)*SHORT_FIXED_ONE))
enum
{
SOME_VALUE= FLOAT_TO_SHORT_FIXED(0.1)
};