diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/call.c | 18 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/overload/defarg8.C | 22 |
3 files changed, 30 insertions, 14 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8e184bc5222..4aa90ee4008 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2014-03-10 Jason Merrill <jason@redhat.com> + PR c++/60367 + * call.c (convert_default_arg): Remove special handling for + CONSTRUCTOR. + PR c++/53492 * parser.c (cp_parser_class_head): Also check PRIMARY_TEMPLATE_P when deciding whether to call push_template_decl for a member class. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index b58c072dfbc..184e92226cc 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -6531,20 +6531,10 @@ convert_default_arg (tree type, tree arg, tree fn, int parmnum, /* We must make a copy of ARG, in case subsequent processing alters any part of it. */ arg = break_out_target_exprs (arg); - if (TREE_CODE (arg) == CONSTRUCTOR) - { - arg = digest_init (type, arg, complain); - arg = convert_for_initialization (0, type, arg, LOOKUP_IMPLICIT, - ICR_DEFAULT_ARGUMENT, fn, parmnum, - complain); - } - else - { - arg = convert_for_initialization (0, type, arg, LOOKUP_IMPLICIT, - ICR_DEFAULT_ARGUMENT, fn, parmnum, - complain); - arg = convert_for_arg_passing (type, arg, complain); - } + arg = convert_for_initialization (0, type, arg, LOOKUP_IMPLICIT, + ICR_DEFAULT_ARGUMENT, fn, parmnum, + complain); + arg = convert_for_arg_passing (type, arg, complain); pop_deferring_access_checks(); pop_defarg_context (); diff --git a/gcc/testsuite/g++.dg/overload/defarg8.C b/gcc/testsuite/g++.dg/overload/defarg8.C new file mode 100644 index 00000000000..b3ddfbb76cf --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/defarg8.C @@ -0,0 +1,22 @@ +// PR c++/60367 +// { dg-do run { target c++11 } } + +extern "C" int printf (const char *, ...); +extern "C" void abort(); + +void *p; +struct foo { + foo() { p = this; } + foo (const foo &) { abort(); } + ~foo() { if (p != this) abort(); } +}; + +void do_something( foo f = {} ) +{ + if (&f != p) abort(); +} + +int main() +{ + do_something(); +} |