diff options
author | Nathan Sidwell <nathan@acm.org> | 2020-11-03 10:15:54 -0800 |
---|---|---|
committer | Nathan Sidwell <nathan@acm.org> | 2020-11-03 10:23:44 -0800 |
commit | 78f2f08ac8f22a0ad412a2abf5225b5fe3176bcf (patch) | |
tree | 687582b6c3faedb709af4dcbacba3e1b417f1c26 | |
parent | f4a0e873be8a6c2787c13bd29c0b2a5df332adeb (diff) | |
download | gcc-78f2f08ac8f22a0ad412a2abf5225b5fe3176bcf.zip gcc-78f2f08ac8f22a0ad412a2abf5225b5fe3176bcf.tar.gz gcc-78f2f08ac8f22a0ad412a2abf5225b5fe3176bcf.tar.bz2 |
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.
-rw-r--r-- | gcc/cp/class.c | 37 |
1 files changed, 20 insertions, 17 deletions
diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 6c21682..c037372 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); |