Re: [PATCH] pr31397 - implement -Wsuggest-override
OK. Jason
[PATCH] pr31397 - implement -Wsuggest-override
From: Trevor Saunders tbsaunde+...@tbsaunde.org Hi, comments fixed. bootstrapped on x86_64-linux, new test passes and regtest pending, ok? Trev c-family/ * c.opt (Wsuggest-override): New option. cp/ * class.c (check_for_override): Warn when a virtual function is an override not marked override. gcc/ * doc/invoke.texi: Document -Wsuggest-override. --- gcc/c-family/c.opt| 5 + gcc/cp/class.c| 4 gcc/doc/invoke.texi | 6 +- gcc/testsuite/g++.dg/warn/Wsuggest-override.C | 23 +++ 4 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/warn/Wsuggest-override.C diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt index f86718b..1f6f793 100644 --- a/gcc/c-family/c.opt +++ b/gcc/c-family/c.opt @@ -578,6 +578,11 @@ Wsuggest-attribute=format C ObjC C++ ObjC++ Var(warn_suggest_attribute_format) Warning Warn about functions which might be candidates for format attributes +Wsuggest-override +C++ ObjC++ Var(warn_override) Warning +Suggest that the override keyword be used when the declaration of a virtual +function overrides another. + Wswitch C ObjC C++ ObjC++ Var(warn_switch) Warning LangEnabledBy(C ObjC C++ ObjC++,Wall) Warn about enumerated switches, with no default, missing a case diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 0ac2124..d2cf4a0 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -2811,6 +2811,10 @@ check_for_override (tree decl, tree ctype) { DECL_VINDEX (decl) = decl; overrides_found = true; + if (warn_override !DECL_OVERRIDE_P (decl) + !DECL_DESTRUCTOR_P (decl)) + warning_at (DECL_SOURCE_LOCATION (decl), OPT_Wsuggest_override, + %q+D can be marked override, decl); } if (DECL_VIRTUAL_P (decl)) diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 9f56f42..d0ee093 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -277,7 +277,7 @@ Objective-C and Objective-C++ Dialects}. -Wstack-protector -Wstack-usage=@var{len} -Wstrict-aliasing @gol -Wstrict-aliasing=n @gol -Wstrict-overflow -Wstrict-overflow=@var{n} @gol -Wsuggest-attribute=@r{[}pure@r{|}const@r{|}noreturn@r{|}format@r{]} @gol --Wsuggest-final-types @gol -Wsuggest-final-methods @gol +-Wsuggest-final-types @gol -Wsuggest-final-methods @gol -Wsuggest-override @gol -Wmissing-format-attribute @gol -Wswitch -Wswitch-default -Wswitch-enum -Wswitch-bool -Wsync-nand @gol -Wsystem-headers -Wtrampolines -Wtrigraphs -Wtype-limits -Wundef @gol @@ -4276,6 +4276,10 @@ class hierarchy graph is more complete. It is recommended to first consider suggestions of @option{-Wsuggest-final-types} and then rebuild with new annotations. +@item -Wsuggest-override +Warn about overriding virtual functions that are not marked with the override +keyword. + @item -Warray-bounds @opindex Wno-array-bounds @opindex Warray-bounds diff --git a/gcc/testsuite/g++.dg/warn/Wsuggest-override.C b/gcc/testsuite/g++.dg/warn/Wsuggest-override.C new file mode 100644 index 000..f820f4b --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wsuggest-override.C @@ -0,0 +1,23 @@ +// { dg-do compile } +// { dg-options -std=c++11 -Wsuggest-override } +struct A +{ + A(); + virtual ~A(); + virtual void f(); + virtual int bar(); + int c(); + operator int(); + virtual operator float(); +}; + +struct B : A +{ + B(); + virtual ~B(); + virtual void f(); // { dg-warning can be marked override } +virtual int bar() override; +int c(); +operator int(); +virtual operator float(); // { dg-warning can be marked override } +}; -- 2.1.3
[PATCH] pr31397 - implement -Wsuggest-override
From: Trevor Saunders tsaund...@mozilla.com Hi, this is a new warning to find places where virtual functions are over ridden, but not marked override. included test passes, I expect comments so regtest is pending, and ChangeLog is omitted. Trev --- gcc/c-family/c.opt| 5 + gcc/cp/class.c| 4 gcc/doc/invoke.texi | 6 +- gcc/testsuite/g++.dg/warn/Wsuggest-override.C | 21 + 4 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/warn/Wsuggest-override.C diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt index 85dcb98..259b520 100644 --- a/gcc/c-family/c.opt +++ b/gcc/c-family/c.opt @@ -574,6 +574,11 @@ Wsuggest-attribute=format C ObjC C++ ObjC++ Var(warn_suggest_attribute_format) Warning Warn about functions which might be candidates for format attributes +Wsuggest-override +C++ ObjC++ Var(warn_override) Warning +Suggest that the override keyword be used when the declaration of a virtual +function overrides another. + Wswitch C ObjC C++ ObjC++ Var(warn_switch) Warning LangEnabledBy(C ObjC C++ ObjC++,Wall) Warn about enumerated switches, with no default, missing a case diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 16279df..515f33f 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -2777,6 +2777,10 @@ check_for_override (tree decl, tree ctype) { DECL_VINDEX (decl) = decl; overrides_found = true; + if (warn_override DECL_VIRTUAL_P (decl) !DECL_OVERRIDE_P (decl) + !DECL_DESTRUCTOR_P (decl)) + warning_at(DECL_SOURCE_LOCATION (decl), OPT_Wsuggest_override, + %q+D can be marked override, decl); } if (DECL_VIRTUAL_P (decl)) diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 89edddb..8741e8e 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -275,7 +275,7 @@ Objective-C and Objective-C++ Dialects}. -Wstack-protector -Wstack-usage=@var{len} -Wstrict-aliasing @gol -Wstrict-aliasing=n @gol -Wstrict-overflow -Wstrict-overflow=@var{n} @gol -Wsuggest-attribute=@r{[}pure@r{|}const@r{|}noreturn@r{|}format@r{]} @gol --Wsuggest-final-types @gol -Wsuggest-final-methods @gol +-Wsuggest-final-types @gol -Wsuggest-final-methods @gol -Wsuggest-override @gol -Wmissing-format-attribute @gol -Wswitch -Wswitch-default -Wswitch-enum -Wswitch-bool -Wsync-nand @gol -Wsystem-headers -Wtrampolines -Wtrigraphs -Wtype-limits -Wundef @gol @@ -4255,6 +4255,10 @@ effective with link time optimization, where the information about the class hiearchy graph is more complete. It is recommended to first consider suggestins of @option{-Wsuggest-final-types} and then rebuild with new annotations. +@item -Wsuggest-override +Warn about overriding virtual functions that are not marked with the override +keyword. + @item -Warray-bounds @opindex Wno-array-bounds @opindex Warray-bounds diff --git a/gcc/testsuite/g++.dg/warn/Wsuggest-override.C b/gcc/testsuite/g++.dg/warn/Wsuggest-override.C new file mode 100644 index 000..929d365 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wsuggest-override.C @@ -0,0 +1,21 @@ +// { dg-do compile } +// { dg-options -std=c++11 -Wsuggest-override } +struct A +{ + A(); + virtual ~A(); + virtual void f(); + virtual int bar(); + operator int(); + virtual operator float(); +}; + +struct B : A +{ + B(); + virtual ~B(); + virtual void f(); // { dg-warning can be marked override } +virtual int bar() override; +operator int(); +virtual operator float(); // { dg-warning can be marked override } +}; -- 2.1.3