diff options
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 |