diff mbox

PING: [C++-11 PATCH] Trailing comma in enum

Message ID 1319969867.2039.7.camel@sara
State New
Headers show

Commit Message

Magnus Fromreide Oct. 30, 2011, 10:17 a.m. UTC
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

Comments

Ville Voutilainen Oct. 30, 2011, 3:45 p.m. UTC | #1
On 30 October 2011 12:17, Magnus Fromreide <magfr@lysator.liu.se> wrote:
> Attached is a variation where maybe_warn_cpp0x is used.
> Please note how my new pedwarn breaks the pattern in maybe_warn_cpp0x.

Looks reasonable to me, but I'm not a maintainer. :) Jason?
diff mbox

Patch

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, };