From 492964a03155dd7f2bc20ff08963e347c6a36854 Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Tue, 18 Jul 2017 17:23:13 -0400 Subject: [PATCH 10/27] C++: provide fix-it hints in -Wsuggest-override This patch extends -Wsuggest-override so that the suggestions contain fix-it hints, provided that it can get at the correct location. Doing so requires the blt_node infrastructure. gcc/cp/ChangeLog: * class.c: Include "gcc-rich-location.h" and "blt.h". (check_for_override): When suggesting functions that can be marked "override", if the location is available via BLT nodes, add a fix-it hint. gcc/testsuite/ChangeLog: * g++.dg/warn/Wsuggest-override.C: Add -fdiagnostics-show-caret and -fblt to the options. Update expected output to show the fix-it hints. --- gcc/cp/class.c | 23 +++++++++++++++++++++-- gcc/testsuite/g++.dg/warn/Wsuggest-override.C | 12 +++++++++++- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 0336ae5..6d0644d 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -37,6 +37,8 @@ along with GCC; see the file COPYING3. If not see #include "gimplify.h" #include "intl.h" #include "asan.h" +#include "gcc-rich-location.h" +#include "blt.h" /* Id for dumping the class hierarchy. */ int class_dump_id; @@ -3024,8 +3026,25 @@ check_for_override (tree decl, tree ctype) overrides_found = true; if (warn_override && !DECL_OVERRIDE_P (decl) && !DECL_DESTRUCTOR_P (decl)) - warning_at (DECL_SOURCE_LOCATION (decl), OPT_Wsuggest_override, - "%qD can be marked override", decl); + { + gcc_rich_location richloc (DECL_SOURCE_LOCATION (decl)); + /* Attempt to suggest adding " override" after the declarator + (and before the semicolon). */ + blt_node *asnode = blt_get_node_for_tree (decl); + if (asnode) + { + /* Expect a member-declaration containing a + decl-specifier-seq declarator token(;). + We want the declarator. */ + blt_node *declarator + = asnode->get_first_child_of_kind (BLT_DECLARATOR); + if (declarator) + richloc.add_fixit_insert_after (declarator->get_finish (), + " override"); + } + warning_at_rich_loc (&richloc, OPT_Wsuggest_override, + "%qD can be marked override", decl); + } } if (DECL_VIRTUAL_P (decl)) diff --git a/gcc/testsuite/g++.dg/warn/Wsuggest-override.C b/gcc/testsuite/g++.dg/warn/Wsuggest-override.C index f820f4b..8f5c133 100644 --- a/gcc/testsuite/g++.dg/warn/Wsuggest-override.C +++ b/gcc/testsuite/g++.dg/warn/Wsuggest-override.C @@ -1,5 +1,5 @@ // { dg-do compile } -// { dg-options "-std=c++11 -Wsuggest-override" } +// { dg-options "-std=c++11 -Wsuggest-override -fdiagnostics-show-caret -fblt" } struct A { A(); @@ -16,8 +16,18 @@ struct B : A B(); virtual ~B(); virtual void f(); // { dg-warning "can be marked override" } +/* { dg-begin-multiline-output "" } + virtual void f(); + ^ + override + { dg-end-multiline-output "" } */ virtual int bar() override; int c(); operator int(); virtual operator float(); // { dg-warning "can be marked override" } +/* { dg-begin-multiline-output "" } + virtual operator float(); + ^~~~~~~~ + override + { dg-end-multiline-output "" } */ }; -- 1.8.5.3