diff options
author | Jason Merrill <jason@redhat.com> | 2001-02-18 14:08:00 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2001-02-18 14:08:00 -0500 |
commit | e0fff4b3a7312cd08165c9a010dbafc1a4c98316 (patch) | |
tree | 78833bf4bd67d918c1690aabd6f664e5a2d426ff /gcc/cp/decl2.c | |
parent | 31189758710a6ea118e5f8a65aad04ea5ef968fd (diff) | |
download | gcc-e0fff4b3a7312cd08165c9a010dbafc1a4c98316.zip gcc-e0fff4b3a7312cd08165c9a010dbafc1a4c98316.tar.gz gcc-e0fff4b3a7312cd08165c9a010dbafc1a4c98316.tar.bz2 |
Do put the VTT parameter in DECL_ARGUMENTS.
* cp-tree.h (struct cp_language_function): Add x_vtt_parm.
(current_vtt_parm): New macro.
(struct lang_decl_flags): Add has_vtt_parm_p, remove vtt_parm.
(DECL_HAS_VTT_PARM_P): New macro.
(DECL_VTT_PARM): Remove.
(FUNCTION_FIRST_USER_PARMTYPE, FUNCTION_FIRST_USER_PARM): New macros.
* decl.c (duplicate_decls): Only copy the operator code if
appropriate.
(start_function): Set current_vtt_parm.
(lang_mark_tree): Don't mark vtt_parm.
* decl2.c (maybe_retrofit_in_chrg): Do add the VTT parm to
DECL_ARGUMENTS. Set DECL_HAS_VTT_PARM_P.
* class.c (build_clone): Maybe remove the VTT parm.
* optimize.c (maybe_clone_body): Set up the VTT parm.
* pt.c (copy_default_args_to_explicit_spec): Preserve the VTT parm.
* call.c (build_over_call): Just allow the VTT arg.
* method.c (make_thunk): Don't set DECL_VTT_PARM.
(do_build_copy_constructor): Use FUNCTION_FIRST_USER_PARM.
(synthesize_method): Use FUNCTION_FIRST_USER_PARMTYPE.
* decl.c (grokdeclarator, copy_args_p, grok_ctor_properties): Likewise.
* error.c (dump_function_decl): Likewise.
* call.c (build_user_type_conversion_1, convert_like_real): Abort
if we try to call a constructor with in-charge or VTT parms.
* method.c (skip_artificial_parms_for): New fn.
* call.c (add_function_candidate, build_over_call): Call it.
* call.c (build_new_method_call): Use current_vtt_parm.
* init.c (expand_virtual_init): Likewise.
* class.c (same_signature_p): No longer static.
* cp-tree.h: Declare it.
* search.c (look_for_overrides_r): Use it.
From-SVN: r39841
Diffstat (limited to 'gcc/cp/decl2.c')
-rw-r--r-- | gcc/cp/decl2.c | 53 |
1 files changed, 34 insertions, 19 deletions
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 20aa6a8..37e6d4a 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -932,7 +932,10 @@ build_artificial_parm (name, type) This function adds the "in-charge" flag to member function FN if appropriate. It is called from grokclassfn and tsubst. - FN must be either a constructor or destructor. */ + FN must be either a constructor or destructor. + + The in-charge flag follows the 'this' parameter, and is followed by the + VTT parm (if any), then the user-written parms. */ void maybe_retrofit_in_chrg (fn) @@ -955,17 +958,38 @@ maybe_retrofit_in_chrg (fn) && !TYPE_USES_VIRTUAL_BASECLASSES (DECL_CONTEXT (fn))) return; - /* First add it to DECL_ARGUMENTS... */ - parm = build_artificial_parm (in_charge_identifier, integer_type_node); - TREE_READONLY (parm) = 1; - parms = DECL_ARGUMENTS (fn); - TREE_CHAIN (parm) = TREE_CHAIN (parms); - TREE_CHAIN (parms) = parm; - - /* ...and then to TYPE_ARG_TYPES. */ arg_types = TYPE_ARG_TYPES (TREE_TYPE (fn)); basetype = TREE_TYPE (TREE_VALUE (arg_types)); - arg_types = hash_tree_chain (integer_type_node, TREE_CHAIN (arg_types)); + arg_types = TREE_CHAIN (arg_types); + + parms = TREE_CHAIN (DECL_ARGUMENTS (fn)); + + /* If this is a subobject constructor or destructor, our caller will + pass us a pointer to our VTT. */ + if (TYPE_USES_VIRTUAL_BASECLASSES (DECL_CONTEXT (fn))) + { + parm = build_artificial_parm (vtt_parm_identifier, vtt_parm_type); + + /* First add it to DECL_ARGUMENTS between 'this' and the real args... */ + TREE_CHAIN (parm) = parms; + parms = parm; + + /* ...and then to TYPE_ARG_TYPES. */ + arg_types = hash_tree_chain (vtt_parm_type, arg_types); + + DECL_HAS_VTT_PARM_P (fn) = 1; + } + + /* Then add the in-charge parm (before the VTT parm). */ + parm = build_artificial_parm (in_charge_identifier, integer_type_node); + TREE_CHAIN (parm) = parms; + parms = parm; + arg_types = hash_tree_chain (integer_type_node, arg_types); + + /* Insert our new parameter(s) into the list. */ + TREE_CHAIN (DECL_ARGUMENTS (fn)) = parms; + + /* And rebuild the function type. */ fntype = build_cplus_method_type (basetype, TREE_TYPE (TREE_TYPE (fn)), arg_types); if (TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn))) @@ -975,15 +999,6 @@ maybe_retrofit_in_chrg (fn) /* Now we've got the in-charge parameter. */ DECL_HAS_IN_CHARGE_PARM_P (fn) = 1; - - /* If this is a subobject constructor or destructor, our caller will - pass us a pointer to our VTT. */ - if (TYPE_USES_VIRTUAL_BASECLASSES (DECL_CONTEXT (fn))) - { - DECL_VTT_PARM (fn) = build_artificial_parm (vtt_parm_identifier, - vtt_parm_type); - DECL_CONTEXT (DECL_VTT_PARM (fn)) = fn; - } } /* Classes overload their constituent function names automatically. |