From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2122) id 13E1E3875A21; Mon, 25 Jul 2022 13:23:52 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 13E1E3875A21 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Jason Merrill To: gcc-cvs@gcc.gnu.org Subject: [gcc r13-1824] c++: -Woverloaded-virtual false positive [PR87729] X-Act-Checkin: gcc X-Git-Author: Jason Merrill X-Git-Refname: refs/heads/master X-Git-Oldrev: 556b816b820f6749910784cbaca8bb0bb822a970 X-Git-Newrev: 4c6567b4090d9363f90b5c68e238e7d0964b6e89 Message-Id: <20220725132352.13E1E3875A21@sourceware.org> Date: Mon, 25 Jul 2022 13:23:52 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 25 Jul 2022 13:23:52 -0000 https://gcc.gnu.org/g:4c6567b4090d9363f90b5c68e238e7d0964b6e89 commit r13-1824-g4c6567b4090d9363f90b5c68e238e7d0964b6e89 Author: Jason Merrill Date: Sun Jul 24 23:26:59 2022 -0400 c++: -Woverloaded-virtual false positive [PR87729] My attempt to shortcut unnecessary checking after finding a match was also wrong for multiple inheritance, so let's give up on it. PR c++/87729 gcc/cp/ChangeLog: * class.cc (warn_hidden): Remove shortcut. gcc/testsuite/ChangeLog: * g++.dg/warn/Woverloaded-virt4.C: New test. Diff: --- gcc/cp/class.cc | 11 +++++++---- gcc/testsuite/g++.dg/warn/Woverloaded-virt4.C | 7 +++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/gcc/cp/class.cc b/gcc/cp/class.cc index eb69e7f985c..a12d3673b96 100644 --- a/gcc/cp/class.cc +++ b/gcc/cp/class.cc @@ -3040,22 +3040,25 @@ warn_hidden (tree t) bool seen_non_override = false; for (tree fndecl : ovl_range (fns)) { + bool any_override = false; if (TREE_CODE (fndecl) == FUNCTION_DECL && DECL_VINDEX (fndecl)) { /* If the method from the base class has the same signature as the method from the derived class, it - has been overridden. */ + has been overridden. Note that we can't move on + after finding one match: fndecl might override + multiple base fns. */ 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; - goto next; + any_override = true; } } - seen_non_override = true; - next:; + if (!any_override) + seen_non_override = true; } if (!seen_non_override && warn_overloaded_virtual == 1) diff --git a/gcc/testsuite/g++.dg/warn/Woverloaded-virt4.C b/gcc/testsuite/g++.dg/warn/Woverloaded-virt4.C new file mode 100644 index 00000000000..b4d86689cf5 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Woverloaded-virt4.C @@ -0,0 +1,7 @@ +// PR c++/87729 +// { dg-additional-options -Woverloaded-virtual } + +struct S1 { virtual void f(); }; +struct S2: S1 {}; +struct S3: S1 {}; +struct S4: S2, S3 { void f(); };