diff options
author | Jason Merrill <jason@redhat.com> | 2022-06-24 14:40:12 -0400 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2022-06-24 18:23:48 -0400 |
commit | 113844d68e94f4e9c0e946db351ba7d3d4a1335a (patch) | |
tree | 4700337540406594bea63da9bf9543c45207dd64 /gcc/cp/class.cc | |
parent | 75fa80bb5654d1f8b21310118f41705b74168039 (diff) | |
download | gcc-113844d68e94f4e9c0e946db351ba7d3d4a1335a.zip gcc-113844d68e94f4e9c0e946db351ba7d3d4a1335a.tar.gz gcc-113844d68e94f4e9c0e946db351ba7d3d4a1335a.tar.bz2 |
c++: Include -Woverloaded-virtual in -Wall [PR87729]
This seems like a good warning to have in -Wall, as requested. But as
pointed out in PR20423, some users want a warning only when a derived
function doesn't override any base function. So let's put that lesser
version in -Wall (and -Woverloaded-virtual=1) while leaving the semantics
for the existing option the same.
PR c++/87729
PR c++/20423
gcc/c-family/ChangeLog:
* c.opt (Woverloaded-virtual): Add levels, include in -Wall.
gcc/ChangeLog:
* doc/invoke.texi: Document changes.
gcc/cp/ChangeLog:
* class.cc (warn_hidden): Handle -Woverloaded-virtual=1.
gcc/testsuite/ChangeLog:
* g++.dg/warn/Woverloaded-virt1.C: New test.
* g++.dg/warn/Woverloaded-virt2.C: New test.
Diffstat (limited to 'gcc/cp/class.cc')
-rw-r--r-- | gcc/cp/class.cc | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/gcc/cp/class.cc b/gcc/cp/class.cc index 3c195b3..17683f4 100644 --- a/gcc/cp/class.cc +++ b/gcc/cp/class.cc @@ -3034,6 +3034,7 @@ warn_hidden (tree t) continue; /* Remove any overridden functions. */ + bool seen_non_override = false; for (tree fndecl : ovl_range (fns)) { if (TREE_CODE (fndecl) == FUNCTION_DECL @@ -3045,20 +3046,28 @@ warn_hidden (tree t) for (size_t k = 0; k < base_fndecls.length (); k++) if (base_fndecls[k] && same_signature_p (fndecl, base_fndecls[k])) - base_fndecls[k] = NULL_TREE; + { + base_fndecls[k] = NULL_TREE; + goto next; + } } + seen_non_override = true; + next:; } + if (!seen_non_override && warn_overloaded_virtual == 1) + /* All the derived fns override base virtuals. */ + return; + /* Now give a warning for all base functions without overriders, as they are hidden. */ - tree base_fndecl; - FOR_EACH_VEC_ELT (base_fndecls, j, base_fndecl) + for (tree base_fndecl : base_fndecls) if (base_fndecl) { auto_diagnostic_group d; /* Here we know it is a hider, and no overrider exists. */ if (warning_at (location_of (base_fndecl), - OPT_Woverloaded_virtual, + OPT_Woverloaded_virtual_, "%qD was hidden", base_fndecl)) inform (location_of (fns), " by %qD", fns); } |