From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2153) id B96A13861817; Wed, 26 Aug 2020 09:15:39 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B96A13861817 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1598433339; bh=9Fbb0Ry0lJrNLqj6yplKvSpWNdDaOaTIqMmj5y3tiqw=; h=From:To:Subject:Date:From; b=DSYc757uq8kB2/jsXxM0XHJjNgcEnyJWVSJJL/brZLhrek5WPoPcMcefLd5jSUwhU JIh9QdvWfSwzscF2rovW2fGZdLrxbkCe8yDiCNp9Qp4BZSkw9noND/YIU483zSUOlV bovvkM+XShT1YiVNMER5jVFCGswja/HxfiSkew2g= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Jakub Jelinek To: gcc-cvs@gcc.gnu.org Subject: [gcc(refs/vendors/redhat/heads/gcc-10-branch)] c++: Emit as-base 'tor symbols for final class. [PR95428] X-Act-Checkin: gcc X-Git-Author: Jason Merrill X-Git-Refname: refs/vendors/redhat/heads/gcc-10-branch X-Git-Oldrev: 5effbd0733f9a4d42ddae965e4c28701be7811ac X-Git-Newrev: d94796352234def681a34eef99dad18bccecbca7 Message-Id: <20200826091539.B96A13861817@sourceware.org> Date: Wed, 26 Aug 2020 09:15:39 +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: Wed, 26 Aug 2020 09:15:39 -0000 https://gcc.gnu.org/g:d94796352234def681a34eef99dad18bccecbca7 commit d94796352234def681a34eef99dad18bccecbca7 Author: Jason Merrill Date: Fri Aug 21 16:23:03 2020 -0400 c++: Emit as-base 'tor symbols for final class. [PR95428] For PR70462 I stopped emitting the as-base constructor and destructor variants for final classes, because they can never be called. Except that it turns out that clang calls base variants from complete variants, even for classes with virtual bases, and in some cases inlines them such that the calls to the base variant are exposed. So we need to continue to emit the as-base symbols, even though they're unreachable by G++-compiled code. gcc/cp/ChangeLog: PR c++/95428 * optimize.c (populate_clone_array): Revert PR70462 change. (maybe_clone_body): Likewise. gcc/testsuite/ChangeLog: * g++.dg/other/final8.C: Adjust expected output. Diff: --- gcc/cp/optimize.c | 10 ++-------- gcc/testsuite/g++.dg/other/final8.C | 8 ++++++-- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/gcc/cp/optimize.c b/gcc/cp/optimize.c index d4f12dbb84d..e112a4b4f82 100644 --- a/gcc/cp/optimize.c +++ b/gcc/cp/optimize.c @@ -244,19 +244,13 @@ populate_clone_array (tree fn, tree *fns) fns[1] = NULL_TREE; fns[2] = NULL_TREE; - tree ctx = DECL_CONTEXT (fn); - FOR_EACH_CLONE (clone, fn) if (DECL_NAME (clone) == complete_dtor_identifier || DECL_NAME (clone) == complete_ctor_identifier) fns[1] = clone; else if (DECL_NAME (clone) == base_dtor_identifier || DECL_NAME (clone) == base_ctor_identifier) - { - /* We don't need to define the base variants for a final class. */ - if (!CLASSTYPE_FINAL (ctx)) - fns[0] = clone; - } + fns[0] = clone; else if (DECL_NAME (clone) == deleting_dtor_identifier) fns[2] = clone; else @@ -481,7 +475,7 @@ maybe_clone_body (tree fn) /* Remember if we can't have multiple clones for some reason. We need to check this before we remap local static initializers in clone_body. */ - if (!tree_versionable_function_p (fn) && fns[0] && fns[1]) + if (!tree_versionable_function_p (fn)) need_alias = true; /* We know that any clones immediately follow FN in the TYPE_FIELDS diff --git a/gcc/testsuite/g++.dg/other/final8.C b/gcc/testsuite/g++.dg/other/final8.C index f90f94e9ea0..67c87112353 100644 --- a/gcc/testsuite/g++.dg/other/final8.C +++ b/gcc/testsuite/g++.dg/other/final8.C @@ -1,6 +1,10 @@ +// PR c++/70462 +// PR c++/95428 // { dg-do compile { target c++11 } } -// { dg-final { scan-assembler-not "_ZN1BC2Ev" } } -// { dg-final { scan-assembler-not "_ZN1BD2Ev" } } +// { dg-final { scan-assembler "_ZN1BC1Ev" } } +// { dg-final { scan-assembler "_ZN1BC2Ev" } } +// { dg-final { scan-assembler "_ZN1BD2Ev" } } +// { dg-final { scan-assembler "_ZN1BD1Ev" } } struct A { int i; A(); virtual ~A() = 0; }; struct B final: public virtual A { int j; B(); ~B(); };