Hi, the following patch adds fix-it hints to the C++ parser for two wrongly used keywords detected in cp_parser_decl_specifier_seq.
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_decl_specifier_seq): Add fix-it hints for friend outside class and obsolete auto as storage-class-specifier. Index: gcc/cp/parser.c =================================================================== --- gcc/cp/parser.c 2017-04-28 +++ gcc/cp/parser.c 2017-04-28 @@ -13213,7 +13213,9 @@ 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 @@ -13277,8 +13279,11 @@ /* 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"); + 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, =================================================================== 2017-04-29 Volker Reichelt <v.reich...@netcologne.de> * g++.dg/diagnostic/friend1.C: New test. * g++.dg/cpp0x/auto1.C: Add check for fix-it hint. Index: gcc/testsuite/g++.dg/diagnostic/friend1.C =================================================================== --- gcc/testsuite/g++.dg/diagnostic/friend1.C 2017-04-29 +++ gcc/testsuite/g++.dg/diagnostic/friend1.C 2017-04-29 @@ -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 "" } */ Index: gcc/testsuite/g++.dg/cpp0x/auto1.C =================================================================== --- gcc/testsuite/g++.dg/cpp0x/auto1.C (revision 247406) +++ gcc/testsuite/g++.dg/cpp0x/auto1.C (working copy) @@ -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 "" } */ } ===================================================================