summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorreichelt <reichelt@138bc75d-0d04-0410-961f-82ee72b054a4>2017-07-17 16:58:00 +0000
committerreichelt <reichelt@138bc75d-0d04-0410-961f-82ee72b054a4>2017-07-17 16:58:00 +0000
commitd216668406c003db426e84f28c548f535da3c40c (patch)
treece133a70b7b0ed1ef50c49e0ff1fb510b8eb8b3e
parent05b11131ba3fba12dff414ac7923980bf011d798 (diff)
downloadgcc-d216668406c003db426e84f28c548f535da3c40c.tar.gz
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@250282 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/parser.c15
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/auto1.C9
-rw-r--r--gcc/testsuite/g++.dg/diagnostic/friend1.C8
5 files changed, 35 insertions, 7 deletions
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 <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
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, "%<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,
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 <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.
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 "" } */