diff options
author | Nathan Sidwell <nathan@codesourcery.com> | 2001-04-11 08:43:16 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2001-04-11 08:43:16 +0000 |
commit | a209577830107724ff2fae5db238623737d8916c (patch) | |
tree | 507ac15067b624a42002a748e5d7ed9cd9bb53c4 /gcc/cp | |
parent | 45ea80f7101240796d3473c1f5067a6a7398f6ed (diff) | |
download | gcc-a209577830107724ff2fae5db238623737d8916c.zip gcc-a209577830107724ff2fae5db238623737d8916c.tar.gz gcc-a209577830107724ff2fae5db238623737d8916c.tar.bz2 |
method.c (implicitly_declare_fn): Commonize code for copy ctor and assignment op.
cp:
* method.c (implicitly_declare_fn): Commonize code for copy ctor
and assignment op. Set TREE_USED for parameter.
testsuite:
* g++.old-deja/g++.other/warn6.C: New test.
From-SVN: r41243
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/method.c | 52 |
2 files changed, 29 insertions, 28 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7b5aee3..6a871d4 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2001-04-11 Nathan Sidwell <nathan@codesourcery.com> + + * method.c (implicitly_declare_fn): Commonize code for copy ctor + and assignment op. Set TREE_USED for parameter. + 2001-04-10 Mark Mitchell <mark@codesourcery.com> * class.c (find_final_overrider_data): Add `candidates'. diff --git a/gcc/cp/method.c b/gcc/cp/method.c index 7c55fd8..2f89484 100644 --- a/gcc/cp/method.c +++ b/gcc/cp/method.c @@ -957,8 +957,8 @@ implicitly_declare_fn (kind, type, const_p) tree declspecs = NULL_TREE; tree fn, args = NULL_TREE; tree raises = empty_except_spec; - tree argtype; int retref = 0; + int has_parm = 0; tree name = constructor_name (TYPE_IDENTIFIER (type)); switch (kind) @@ -977,40 +977,33 @@ implicitly_declare_fn (kind, type, const_p) break; case sfk_copy_constructor: - { - struct copy_data data; - - if (const_p) - type = build_qualified_type (type, TYPE_QUAL_CONST); - argtype = build_reference_type (type); - args = tree_cons (NULL_TREE, - build_tree_list (hash_tree_chain (argtype, NULL_TREE), - get_identifier ("_ctor_arg")), - void_list_node); - data.name = NULL; - data.quals = const_p ? TYPE_QUAL_CONST : 0; - raises = synthesize_exception_spec (type, &locate_copy, &data); - break; - } case sfk_assignment_operator: { struct copy_data data; + tree argtype; - retref = 1; - declspecs = build_tree_list (NULL_TREE, type); + has_parm = 1; + data.name = NULL; + data.quals = 0; + if (kind == sfk_assignment_operator) + { + retref = 1; + declspecs = build_tree_list (NULL_TREE, type); + name = ansi_assopname (NOP_EXPR); + data.name = name; + } if (const_p) - type = build_qualified_type (type, TYPE_QUAL_CONST); - - name = ansi_assopname (NOP_EXPR); - + { + data.quals = TYPE_QUAL_CONST; + type = build_qualified_type (type, TYPE_QUAL_CONST); + } + argtype = build_reference_type (type); - args = tree_cons (NULL_TREE, - build_tree_list (hash_tree_chain (argtype, NULL_TREE), - get_identifier ("_ctor_arg")), - void_list_node); - data.name = name; - data.quals = const_p ? TYPE_QUAL_CONST : 0; + args = build_tree_list (hash_tree_chain (argtype, NULL_TREE), + get_identifier ("_ctor_arg")); + args = tree_cons (NULL_TREE, args, void_list_node); + raises = synthesize_exception_spec (type, &locate_copy, &data); break; } @@ -1022,10 +1015,13 @@ implicitly_declare_fn (kind, type, const_p) { tree declarator = make_call_declarator (name, args, NULL_TREE, raises); + if (retref) declarator = build_nt (ADDR_EXPR, declarator); fn = grokfield (declarator, declspecs, NULL_TREE, NULL_TREE, NULL_TREE); + if (has_parm) + TREE_USED (FUNCTION_FIRST_USER_PARM (fn)) = 1; } my_friendly_assert (TREE_CODE (fn) == FUNCTION_DECL, 20000408); |