From 344bd5a86133fcdff69396d9cc526317630c0f70 Mon Sep 17 00:00:00 2001 From: Andrew Pinski Date: Thu, 15 Mar 2007 01:27:29 +0000 Subject: [PATCH] re PR c++/31165 (Error: symbol `an_empty_string' is already defined) 2007-03-14 Andrew Pinski PR c++/31165 * call.c (convert_default_arg): Instead of copying the node, unshare it. 2007-03-14 Andrew Pinski PR C++/31165 * g++.dg/other/default7.C: New test. From-SVN: r122941 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/call.c | 2 +- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/other/default7.C | 20 ++++++++++++++++++++ 4 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/other/default7.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2142ac4082b..7d10b2da8ed 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2007-03-14 Andrew Pinski + + PR c++/31165 + * call.c (convert_default_arg): Instead of copying the node, + unshare it. + 2007-03-15 Dirk Mueller PR c++/30860 diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 53129bb881a..9d25298e7dd 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -4683,7 +4683,7 @@ convert_default_arg (tree type, tree arg, tree fn, int parmnum) VAR_DECL. We can avoid the copy for constants, since they are never modified in place. */ if (!CONSTANT_CLASS_P (arg)) - arg = copy_node (arg); + arg = unshare_expr (arg); arg = convert_for_initialization (0, type, arg, LOOKUP_NORMAL, "default argument", fn, parmnum); arg = convert_for_arg_passing (type, arg); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 27974a93a51..47d97704039 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-03-14 Andrew Pinski + + PR C++/31165 + * g++.dg/other/default7.C: New test. + 2007-03-15 Dirk Mueller * g++.dg/warn/Wconversion2.C: New. diff --git a/gcc/testsuite/g++.dg/other/default7.C b/gcc/testsuite/g++.dg/other/default7.C new file mode 100644 index 00000000000..ec523bf8901 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/default7.C @@ -0,0 +1,20 @@ +/* { dg-do assemble } */ +/* { dg-options "-O1" }*/ +// This was PR C++/31165 +// We used to copy the whole decl when we just wantted to +// unshare some expressions for the default argument. +class string { + char *ptr; + int len; + int sz; +}; +class cset { } _cset_init; +string an_empty_string; +void f(string& = an_empty_string); +void +h (void ) +{ +f(); +} + + -- 2.30.2