From: Jason Merrill Date: Mon, 10 Mar 2014 21:06:59 +0000 (-0400) Subject: re PR c++/60367 (Default argument object is not getting constructed) X-Git-Tag: releases/gcc-4.9.0~506 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4a4e80cb6efdea628a8cee19e9dd31fa8b3a98cc;p=thirdparty%2Fgcc.git re PR c++/60367 (Default argument object is not getting constructed) PR c++/60367 * call.c (convert_default_arg): Remove special handling for CONSTRUCTOR. From-SVN: r208465 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8e184bc5222e..4aa90ee40086 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2014-03-10 Jason Merrill + 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 b58c072dfbc5..184e92226cce 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 000000000000..b3ddfbb76cf4 --- /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(); +}