diff options
author | Jason Merrill <jason@redhat.com> | 2019-06-26 00:56:07 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2019-06-26 00:56:07 -0400 |
commit | 09039e9c723456cd008c7fa94ea772ee796cda2c (patch) | |
tree | 60c1334be02c0350836747c878fe057d5b20881e /gcc/cp/optimize.c | |
parent | e21b52afe92f2596a5b0963d6efb5be44ab3b227 (diff) | |
download | gcc-09039e9c723456cd008c7fa94ea772ee796cda2c.zip gcc-09039e9c723456cd008c7fa94ea772ee796cda2c.tar.gz gcc-09039e9c723456cd008c7fa94ea772ee796cda2c.tar.bz2 |
PR c++/70462 - unnecessary base ctor variant with final.
As pointed out in the PR, we don't need base 'tor variants for a final
class, since it can never be a base. I tried also dropping complete
variants for abstract classes, but that runs into ABI compatibility problems
with older releases that refer to those symbols.
* optimize.c (populate_clone_array): Skip base variant if
CLASSTYPE_FINAL.
(maybe_clone_body): We don't need an alias if we are only defining
one clone.
From-SVN: r272669
Diffstat (limited to 'gcc/cp/optimize.c')
-rw-r--r-- | gcc/cp/optimize.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/gcc/cp/optimize.c b/gcc/cp/optimize.c index aace7de..0774857 100644 --- a/gcc/cp/optimize.c +++ b/gcc/cp/optimize.c @@ -247,15 +247,19 @@ populate_clone_array (tree fn, tree *fns) fns[1] = NULL_TREE; fns[2] = NULL_TREE; - /* Look for the complete destructor which may be used to build the - delete destructor. */ + 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) - fns[0] = clone; + { + /* We don't need to define the base variants for a final class. */ + if (!CLASSTYPE_FINAL (ctx)) + fns[0] = clone; + } else if (DECL_NAME (clone) == deleting_dtor_identifier) fns[2] = clone; else @@ -480,7 +484,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)) + if (!tree_versionable_function_p (fn) && fns[0] && fns[1]) need_alias = true; /* We know that any clones immediately follow FN in the TYPE_FIELDS |