diff mbox

[C++] Trailing comma in enum

Message ID 1318170453.2344.8.camel@sara
State New
Headers show

Commit Message

Magnus Fromreide Oct. 9, 2011, 2:27 p.m. UTC
Hi.

As I understand it C++11 allows trailing commas in enum definitions.
Thus I think the following little patch should be included.

On a side note I have to say that the effects of pedwarn_cxx98 are
unexpected, especially in light of the comment above the function body.

/MF
2011-10-09 Magnus Fromreide <magfr@lysator.liu.se>
        * gcc/cp/parser.c (cp_parser_enumerator_list): Do not warn about
        trailing commas in C++0x mode.
        * gcc/testsuite/g++.dg/cpp0x/enum21a.C: Test that enum x { y, } do
        generate a pedwarning in c++98-mode.
        * gcc/testsuite/g++.dg/cpp0x/enum21b.C: Test that enum x { y, }
        don't generate a pedwarning in c++0x-mode.

Comments

Jason Merrill Nov. 4, 2011, 5:38 p.m. UTC | #1
Applied.  Sorry for the delay, thanks for the pings.

Jason
Ville Voutilainen Nov. 4, 2011, 6:37 p.m. UTC | #2
On 4 November 2011 19:38, Jason Merrill <jason@redhat.com> wrote:
> Applied.  Sorry for the delay, thanks for the pings.

So we want to pedwarn directly in parser, rather than use maybe_warn_cpp0x?
Magnus did a newer revision of the patch that uses maybe_warn_cpp0x, although
I don't know what the usual policy for that is.
Jason Merrill Nov. 4, 2011, 6:53 p.m. UTC | #3
On 11/04/2011 02:37 PM, Ville Voutilainen wrote:
> On 4 November 2011 19:38, Jason Merrill<jason@redhat.com>  wrote:
>> Applied.  Sorry for the delay, thanks for the pings.
>
> So we want to pedwarn directly in parser, rather than use maybe_warn_cpp0x?
> Magnus did a newer revision of the patch that uses maybe_warn_cpp0x, although
> I don't know what the usual policy for that is.

Oops, I was ignoring the pings when looking for the actual patch.  :)

But in general I've been only been using maybe_warn_cpp0x for larger 
features.

Jason
Ville Voutilainen Nov. 4, 2011, 7:01 p.m. UTC | #4
On 4 November 2011 20:53, Jason Merrill <jason@redhat.com> wrote:
> Oops, I was ignoring the pings when looking for the actual patch.  :)
> But in general I've been only been using maybe_warn_cpp0x for larger
> features.

Understood. Modification to cp-tree.h make rebuilds heavier, so I don't feel
strongly about it.
diff mbox

Patch

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" }
+
+enum x { y, }; // { dg-warning "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 -std=c++0x" }
+
+enum x { y, };
Index: gcc/cp/parser.c
===================================================================
--- gcc/cp/parser.c	(revision 179711)
+++ gcc/cp/parser.c	(working copy)
@@ -13444,6 +13444,7 @@  cp_parser_elaborated_type_specifier (cp_parser* pa
 
    enum-specifier:
      enum-head { enumerator-list [opt] }
+     enum-head { enumerator-list , } [C++0x]
 
    enum-head:
      enum-key identifier [opt] enum-base [opt]
@@ -13463,6 +13464,8 @@  cp_parser_elaborated_type_specifier (cp_parser* pa
    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++0x]
 
    Returns an ENUM_TYPE representing the enumeration, or NULL_TREE
    if the token stream isn't an enum-specifier after all.  */
@@ -13802,8 +13805,9 @@  cp_parser_enumerator_list (cp_parser* parser, tree
       /* 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");
+	  if (cxx_dialect < cxx0x && !in_system_header)
+	    pedwarn (input_location, OPT_pedantic,
+                     "comma at end of enumerator list");
 	  break;
 	}
     }