mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-26 11:21:37 +08:00
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.
This commit is contained in:
parent
f4a0e873be
commit
78f2f08ac8
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user