From dbc4ecfc5772cc21b2a1f95ec97d186d7b350f8f Mon Sep 17 00:00:00 2001 From: Volker Reichelt Date: Mon, 17 Jul 2017 16:58:00 +0000 Subject: [PATCH] parser.c (cp_parser_decl_specifier_seq): Add fix-it hints for friend outside class and obsolete auto as... * 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 | 5 +++++ gcc/cp/parser.c | 15 ++++++++++----- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/cpp0x/auto1.C | 9 +++++++-- gcc/testsuite/g++.dg/diagnostic/friend1.C | 8 ++++++++ 5 files changed, 35 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/g++.dg/diagnostic/friend1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index fef4c21871d..e46c1286732 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2017-07-17 Volker Reichelt + + * 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 * class.c (maybe_warn_about_overly_private_class): Ignore public diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index d767797550a..88d0b2b250d 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -13382,7 +13382,9 @@ cp_parser_decl_specifier_seq (cp_parser* parser, case RID_FRIEND: if (!at_class_scope_p ()) { - error_at (token->location, "% used outside of class"); + gcc_rich_location richloc (token->location); + richloc.add_fixit_remove (); + error_at_rich_loc (&richloc, "% 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, "%" - " 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, + "% changes meaning in C++11; " + "please remove it"); /* Set the storage class anyway. */ cp_parser_set_storage_class (parser, decl_specs, RID_AUTO, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a0ca5143155..ebd6eaf1ff1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-07-17 Volker Reichelt + + * g++.dg/diagnostic/friend1.C: New test. + * g++.dg/cpp0x/auto1.C: Add check for fix-it hint. + 2017-07-17 Nathan Sidwell * g++.dg/warn/ctor-dtor-privacy-3.C: New. diff --git a/gcc/testsuite/g++.dg/cpp0x/auto1.C b/gcc/testsuite/g++.dg/cpp0x/auto1.C index b8d39051821..dd8f5fc8cf9 100644 --- a/gcc/testsuite/g++.dg/cpp0x/auto1.C +++ b/gcc/testsuite/g++.dg/cpp0x/auto1.C @@ -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 index 00000000000..a35f92ad949 --- /dev/null +++ b/gcc/testsuite/g++.dg/diagnostic/friend1.C @@ -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 "" } */ -- 2.30.2