From: Nathan Sidwell Date: Tue, 3 Nov 2020 18:15:54 +0000 (-0800) Subject: c++: Refactor clone copying X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=78f2f08ac8f22a0ad412a2abf5225b5fe3176bcf;p=gcc.git c++: Refactor clone copying This patch sets copy_fndecl_with_name to always inform rest_of_decl_compilation that it is not a top-level decl (it's a member function). I also refactor build_cdtor_clones to conditionally do the method vector updating. That happens to be a better interface for modules to use. gcc/cp/ * class.c (copy_fndecl_with_name): Always not top level. (build_cdtor_clones): Add update_methods parm, use it to conditionally update the method vec. Return void (clone_cdtor): Adjust. (clone_constructors_and_destructors): Adjust comment. --- diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 6c21682a3e5..c03737294eb 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -4838,7 +4838,10 @@ copy_fndecl_with_name (tree fn, tree name, tree_code code, /* Create the RTL for this function. */ SET_DECL_RTL (clone, NULL); - rest_of_decl_compilation (clone, namespace_bindings_p (), at_eof); + + /* Regardless of the current scope, this is a member function, so + not at namespace scope. */ + rest_of_decl_compilation (clone, /*top_level=*/0, at_eof); return clone; } @@ -4898,8 +4901,9 @@ build_clone (tree fn, tree name, bool need_vtt_parm_p, /* Build the clones of FN, return the number of clones built. These will be inserted onto DECL_CHAIN of FN. */ -static unsigned -build_cdtor_clones (tree fn, bool needs_vtt_p, bool base_omits_inherited_p) +static void +build_cdtor_clones (tree fn, bool needs_vtt_p, bool base_omits_inherited_p, + bool update_methods) { unsigned count = 0; @@ -4935,7 +4939,16 @@ build_cdtor_clones (tree fn, bool needs_vtt_p, bool base_omits_inherited_p) count += 2; } - return count; + /* The original is now an abstract function that is never + emitted. */ + DECL_ABSTRACT_P (fn) = true; + + if (update_methods) + for (tree clone = fn; count--;) + { + clone = DECL_CHAIN (clone); + add_method (DECL_CONTEXT (clone), clone, false); + } } /* Produce declarations for all appropriate clones of FN. If @@ -4958,17 +4971,7 @@ clone_cdtor (tree fn, bool update_methods) bool base_omits_inherited = (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (fn) && base_ctor_omit_inherited_parms (fn)); - unsigned count = build_cdtor_clones (fn, vtt, base_omits_inherited); - - /* Note that this is an abstract function that is never emitted. */ - DECL_ABSTRACT_P (fn) = true; - - if (update_methods) - for (tree clone = fn; count--;) - { - clone = DECL_CHAIN (clone); - add_method (DECL_CONTEXT (clone), clone, false); - } + build_cdtor_clones (fn, vtt, base_omits_inherited, update_methods); } /* DECL is an in charge constructor, which is being defined. This will @@ -5055,8 +5058,8 @@ adjust_clone_args (tree decl) static void clone_constructors_and_destructors (tree t) { - /* While constructors can be via a using declaration, at this point - we no longer need to know that. */ + /* We do not need to propagate the usingness to the clone, at this + point that is not needed. */ for (ovl_iterator iter (CLASSTYPE_CONSTRUCTORS (t)); iter; ++iter) clone_cdtor (*iter, /*update_methods=*/true);