aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2001-04-11 08:43:16 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2001-04-11 08:43:16 +0000
commita209577830107724ff2fae5db238623737d8916c (patch)
tree507ac15067b624a42002a748e5d7ed9cd9bb53c4 /gcc/cp
parent45ea80f7101240796d3473c1f5067a6a7398f6ed (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/cp/method.c52
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);