This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] c++ parser: fix-it hints for wrong usage of 'friend' and 'auto'
- From: Volker Reichelt <v dot reichelt at netcologne dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Sun, 30 Apr 2017 00:23:11 +0200 (CEST)
- Subject: [PATCH] c++ parser: fix-it hints for wrong usage of 'friend' and 'auto'
- Authentication-results: sourceware.org; auth=none
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.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.
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.reichelt@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 "" } */
}
===================================================================