On Sat, 2011-10-29 at 20:48 +0300, Ville Voutilainen wrote: > >Could someone please review this? > > + if (cxx_dialect < cxx0x && !in_system_header) > + pedwarn (input_location, OPT_pedantic, > + "comma at end of enumerator list"); > > Why not use maybe_warn_cpp0x there?
maybe_warn_cpp0x seems to handle cases were C++11 extensions are used but in this case a GNU extension is adopted by the standard so I wanted to make a minimal change. Attached is a variation where maybe_warn_cpp0x is used. Please note how my new pedwarn breaks the pattern in maybe_warn_cpp0x. One could of course imagine changing the message to something like "comma at end of enumerator list is not a warning " \ "with -std=c++0x or -std=gnu++0x" but it still stands out as different in that function so I do not know... /MF
Index: gcc/cp/error.c =================================================================== --- gcc/cp/error.c (revision 180672) +++ gcc/cp/error.c (working copy) @@ -3255,6 +3255,10 @@ "user-defined literals " "only available with -std=c++0x or -std=gnu++0x"); break; + case CPP0X_ENUM_TRAILING_COMMA: + pedwarn (input_location, OPT_pedantic, + "comma at end of enumerator list"); + break; default: gcc_unreachable (); } Index: gcc/cp/parser.c =================================================================== --- gcc/cp/parser.c (revision 180672) +++ gcc/cp/parser.c (working copy) @@ -14058,6 +14058,7 @@ enum-specifier: enum-head { enumerator-list [opt] } + enum-head { enumerator-list , } [C++11] enum-head: enum-key identifier [opt] enum-base [opt] @@ -14077,6 +14078,8 @@ GNU Extensions: enum-key attributes[opt] identifier [opt] enum-base [opt] { enumerator-list [opt] }attributes[opt] + enum-key attributes[opt] identifier [opt] enum-base [opt] + { enumerator-list , }attributes[opt] [C++11] Returns an ENUM_TYPE representing the enumeration, or NULL_TREE if the token stream isn't an enum-specifier after all. */ @@ -14416,8 +14419,7 @@ /* If the next token is a `}', there is a trailing comma. */ if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE)) { - if (!in_system_header) - pedwarn (input_location, OPT_pedantic, "comma at end of enumerator list"); + maybe_warn_cpp0x(CPP0X_ENUM_TRAILING_COMMA); break; } } Index: gcc/cp/cp-tree.h =================================================================== --- gcc/cp/cp-tree.h (revision 180672) +++ gcc/cp/cp-tree.h (working copy) @@ -402,7 +402,9 @@ /* non-static data member initializers */ CPP0X_NSDMI, /* user defined literals */ - CPP0X_USER_DEFINED_LITERALS + CPP0X_USER_DEFINED_LITERALS, + /* trailing comma in enumerations */ + CPP0X_ENUM_TRAILING_COMMA } cpp0x_warn_str; /* The various kinds of operation used by composite_pointer_type. */ Index: gcc/testsuite/g++.dg/cpp0x/enum21a.C =================================================================== --- gcc/testsuite/g++.dg/cpp0x/enum21a.C (revision 0) +++ gcc/testsuite/g++.dg/cpp0x/enum21a.C (revision 0) @@ -0,0 +1,4 @@ +// { dg-do compile } +// { dg-options "-pedantic-errors -std=c++98" } + +enum x { y, }; // { dg-error "comma at end of enumerator list" } Index: gcc/testsuite/g++.dg/cpp0x/enum21b.C =================================================================== --- gcc/testsuite/g++.dg/cpp0x/enum21b.C (revision 0) +++ gcc/testsuite/g++.dg/cpp0x/enum21b.C (revision 0) @@ -0,0 +1,4 @@ +// { dg-do compile } +// { dg-options "-pedantic-errors -std=c++0x" } + +enum x { y, };