parser.c (cp_parser_decl_specifier_seq): Add fix-it hints for friend outside class...
authorVolker Reichelt <v.reichelt@netcologne.de>
Mon, 17 Jul 2017 16:58:00 +0000 (16:58 +0000)
committerVolker Reichelt <reichelt@gcc.gnu.org>
Mon, 17 Jul 2017 16:58:00 +0000 (16:58 +0000)
        * parser.c (cp_parser_decl_specifier_seq): Add fix-it hints for
        friend outside class and obsolete auto as storage-class-specifier.

        * g++.dg/diagnostic/friend1.C: New test.
        * g++.dg/cpp0x/auto1.C: Add check for fix-it hint.

From-SVN: r250282

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/auto1.C
gcc/testsuite/g++.dg/diagnostic/friend1.C [new file with mode: 0644]

index fef4c21871d8e39548684d4f50f4141167eae97b..e46c128673207e7fa9368d76910ef108b5c16602 100644 (file)
@@ -1,3 +1,8 @@
+2017-07-17  Volker Reichelt  <v.reichelt@netcologne.de>
+
+       * parser.c (cp_parser_decl_specifier_seq): Add fix-it hints for
+       friend outside class and obsolete auto as storage-class-specifier.
+
 2017-07-17  Nathan Sidwell  <nathan@acm.org>
 
        * class.c (maybe_warn_about_overly_private_class): Ignore public
index d767797550a6c859259aadf6699506e7c82c6895..88d0b2b250d649ed2e4d5e0cc81ca480f15de124 100644 (file)
@@ -13382,7 +13382,9 @@ cp_parser_decl_specifier_seq (cp_parser* parser,
        case RID_FRIEND:
          if (!at_class_scope_p ())
            {
-             error_at (token->location, "%<friend%> used outside of class");
+             gcc_rich_location richloc (token->location);
+             richloc.add_fixit_remove ();
+             error_at_rich_loc (&richloc, "%<friend%> used outside of class");
              cp_lexer_purge_token (parser->lexer);
            }
          else
@@ -13444,10 +13446,13 @@ cp_parser_decl_specifier_seq (cp_parser* parser,
              /* Consume the token.  */
              cp_lexer_consume_token (parser->lexer);
 
-              /* Complain about `auto' as a storage specifier, if
-                 we're complaining about C++0x compatibility.  */
-              warning_at (token->location, OPT_Wc__11_compat, "%<auto%>"
-                         " changes meaning in C++11; please remove it");
+             /* Complain about `auto' as a storage specifier, if
+                we're complaining about C++0x compatibility.  */
+             gcc_rich_location richloc (token->location);
+             richloc.add_fixit_remove ();
+             warning_at_rich_loc (&richloc, OPT_Wc__11_compat,
+                                  "%<auto%> changes meaning in C++11; "
+                                  "please remove it");
 
               /* Set the storage class anyway.  */
               cp_parser_set_storage_class (parser, decl_specs, RID_AUTO,
index a0ca514315517b1015a4b1b5c81f90b3642d8da2..ebd6eaf1ff1a989c3a00d07b4f8255c924dab6d5 100644 (file)
@@ -1,3 +1,8 @@
+2017-07-17  Volker Reichelt  <v.reichelt@netcologne.de>
+
+       * g++.dg/diagnostic/friend1.C: New test.
+       * g++.dg/cpp0x/auto1.C: Add check for fix-it hint.
+
 2017-07-17  Nathan Sidwell  <nathan@acm.org>
 
        * g++.dg/warn/ctor-dtor-privacy-3.C: New.
index b8d390518218f017a7959e47f808b0f68e3264be..dd8f5fc8cf924137800c08b866d4dbd07ccebdb6 100644 (file)
@@ -1,9 +1,14 @@
 // { dg-do compile { target c++11 } }
-// { dg-options "-std=c++98 -Wc++11-compat" }
+// { dg-options "-std=c++98 -Wc++11-compat -fdiagnostics-show-caret" }
 
 // Test warning for use of auto in C++98 mode with C++11
 // compatibility warnings
 void f()
 {
-  auto int x = 5; // { dg-warning "changes meaning" }
+  auto int x = 5; /* { dg-warning "changes meaning" }
+  { dg-begin-multiline-output "" }
+   auto int x = 5;
+   ^~~~
+   ----
+  { dg-end-multiline-output "" } */
 }
diff --git a/gcc/testsuite/g++.dg/diagnostic/friend1.C b/gcc/testsuite/g++.dg/diagnostic/friend1.C
new file mode 100644 (file)
index 0000000..a35f92a
--- /dev/null
@@ -0,0 +1,8 @@
+// { dg-options "-fdiagnostics-show-caret" }
+
+friend void foo();  /* { dg-error "used outside of class" }
+  { dg-begin-multiline-output "" }
+ friend void foo();
+ ^~~~~~
+ ------
+  { dg-end-multiline-output "" } */