diff --git a/clang/include/clang/Basic/DiagnosticKinds.def b/clang/include/clang/Basic/DiagnosticKinds.def index 2fd6ac5afed9..a85e0df32483 100644 --- a/clang/include/clang/Basic/DiagnosticKinds.def +++ b/clang/include/clang/Basic/DiagnosticKinds.def @@ -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, diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 411307522be7..4fd13c3f96b7 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -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 { diff --git a/clang/test/Sema/PR2963-enum-constant.c b/clang/test/Sema/PR2963-enum-constant.c new file mode 100644 index 000000000000..28becc379375 --- /dev/null +++ b/clang/test/Sema/PR2963-enum-constant.c @@ -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<