Hi,

the following patch adds fix-it hints to the C++ parser for a stray
comma and a missing semicolon at the end of a member declaration.

Bootstrapped and regtested on x86_64-pc-linux-gnu.

OK for trunk?

Regards,
Volker


2017-04-29  Volker Reichelt  <v.reich...@netcologne.de>

        * parser.c (cp_parser_member_declaration): Add fix-it hints for
        stray comma and missing semicolon at end of member declaration.

Index: gcc/cp/parser.c
===================================================================
--- gcc/cp/parser.c     2017-04-28
+++ gcc/cp/parser.c     2017-04-28
@@ -23461,8 +23461,10 @@
              if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
                {
                  cp_token *token = cp_lexer_previous_token (parser->lexer);
-                 error_at (token->location,
-                           "stray %<,%> at end of member declaration");
+                 gcc_rich_location richloc (token->location);
+                 richloc.add_fixit_remove ();
+                 error_at_rich_loc (&richloc, "stray %<,%> at end of "
+                                    "member declaration");
                }
            }
          /* If the next token isn't a `;', then we have a parse error.  */
@@ -23473,8 +23475,10 @@
                 actual semicolon is missing.  Find the previous token
                 and use that for our error position.  */
              cp_token *token = cp_lexer_previous_token (parser->lexer);
-             error_at (token->location,
-                       "expected %<;%> at end of member declaration");
+             gcc_rich_location richloc (token->location);
+             richloc.add_fixit_insert_after (";");
+             error_at_rich_loc (&richloc, "expected %<;%> at end of "
+                                "member declaration");
 
              /* Assume that the user meant to provide a semicolon.  If
                 we were to cp_parser_skip_to_end_of_statement, we might
===================================================================

2017-04-29  Volker Reichelt  <v.reich...@netcologne.de>

        * g++.dg/diagnostic/member-decl-1.C: New test.

Index: gcc/testsuite/g++.dg/diagnostic/member-decl-1.C
===================================================================
--- gcc/testsuite/g++.dg/diagnostic/member-decl-1.C     2017-04-29
+++ gcc/testsuite/g++.dg/diagnostic/member-decl-1.C     2017-04-29
@@ -0,0 +1,18 @@
+// { dg-options "-fdiagnostics-show-caret" }
+
+struct A
+{
+  int i,;  /* { dg-error "stray .,. at end of member declaration" }
+  { dg-begin-multiline-output "" }
+   int i,;
+        ^
+        -
+  { dg-end-multiline-output "" } */
+
+  int j  /* { dg-error "expected .;. at end of member declaration" }
+  { dg-begin-multiline-output "" }
+   int j
+       ^
+        ;
+  { dg-end-multiline-output "" } */
+};
===================================================================

Reply via email to