From cb9aa15d4800610efc9311820264f652142e8fdb Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Tue, 13 May 2014 12:05:01 -0400 Subject: [PATCH] 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: r210381 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/call.c | 18 ++++-------------- gcc/testsuite/g++.dg/overload/defarg8.C | 22 ++++++++++++++++++++++ 3 files changed, 32 insertions(+), 14 deletions(-) create mode 100644 gcc/testsuite/g++.dg/overload/defarg8.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b21c15f462fc..d1b4ed1b765e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2014-05-13 Jason Merrill + + PR c++/60367 + * call.c (convert_default_arg): Remove special handling for + CONSTRUCTOR. + 2014-04-28 Daniel Gutson * typeck.c (build_reinterpret_cast_1): Pass proper argument to diff --git a/gcc/cp/call.c b/gcc/cp/call.c index ca7d3edebdc6..db5a17fdf569 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -6423,20 +6423,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(); +} -- 2.47.2