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
This commit is contained in:
parent
45ea80f710
commit
a209577830
|
@ -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'.
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2001-04-11 Nathan Sidwell <nathan@codesourcery.com>
|
||||
|
||||
* g++.old-deja/g++.other/warn6.C: New test.
|
||||
|
||||
22001-04-11 Peter Schmid <schmid@snake.iap.physik.tu-darmstadt.de>
|
||||
|
||||
* g++.old-deja/g++.robertl/eb42.C: Same.
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
// Build don't link:
|
||||
// Special g++ Options: -W -Wall
|
||||
|
||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
// Contributed by Nathan Sidwell 2 Mar 2001 <nathan@codesourcery.com>
|
||||
|
||||
// Bug 2139. We gave an erronous warning about an unused parm on a
|
||||
// synthesized function
|
||||
|
||||
struct A
|
||||
{
|
||||
virtual ~A ();
|
||||
};
|
||||
void foo (A const &a)
|
||||
{
|
||||
A a1 = a;
|
||||
}
|
Loading…
Reference in New Issue