diff options
author | Joseph Myers <joseph@codesourcery.com> | 2009-04-26 00:30:10 +0100 |
---|---|---|
committer | Joseph Myers <jsm28@gcc.gnu.org> | 2009-04-26 00:30:10 +0100 |
commit | 6895bac810775d772310a2772b7eafd0ac944b5f (patch) | |
tree | 35521b0d5e431f68faee7dbbfd427e26918ae543 /gcc/c-decl.c | |
parent | 24070fcb42eca4e9df8129f9c3ffb3cf71379fa5 (diff) | |
download | gcc-6895bac810775d772310a2772b7eafd0ac944b5f.zip gcc-6895bac810775d772310a2772b7eafd0ac944b5f.tar.gz gcc-6895bac810775d772310a2772b7eafd0ac944b5f.tar.bz2 |
c-decl.c (build_enumerator): Allow values folding to integer constants but not integer constant expressions...
* c-decl.c (build_enumerator): Allow values folding to integer
constants but not integer constant expressions with a pedwarn if
pedantic.
testsuite:
* gcc.dg/enum-const-1.c, gcc.dg/enum-const-2.c,
gcc.dg/enum-const-3.c: New tests.
* gcc.dg/gnu89-const-expr-1.c, gcc.dg/gnu99-const-expr-1.c: Use
-pedantic-errors. Update expected diagnostics.
From-SVN: r146789
Diffstat (limited to 'gcc/c-decl.c')
-rw-r--r-- | gcc/c-decl.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/gcc/c-decl.c b/gcc/c-decl.c index 9693a34..7732d5a 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -6077,16 +6077,32 @@ build_enumerator (struct c_enum_contents *the_enum, tree name, tree value, undeclared identifier) - just ignore the value expression. */ if (value == error_mark_node) value = 0; - else if (!INTEGRAL_TYPE_P (TREE_TYPE (value)) - || TREE_CODE (value) != INTEGER_CST) + else if (!INTEGRAL_TYPE_P (TREE_TYPE (value))) { error ("enumerator value for %qE is not an integer constant", name); value = 0; } else { - value = default_conversion (value); - constant_expression_warning (value); + if (TREE_CODE (value) != INTEGER_CST) + { + value = c_fully_fold (value, false, NULL); + if (TREE_CODE (value) == INTEGER_CST) + pedwarn (value_loc, OPT_pedantic, + "enumerator value for %qE is not an integer " + "constant expression", name); + } + if (TREE_CODE (value) != INTEGER_CST) + { + error ("enumerator value for %qE is not an integer constant", + name); + value = 0; + } + else + { + value = default_conversion (value); + constant_expression_warning (value); + } } } |