summaryrefslogtreecommitdiffstats
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/call.c18
-rw-r--r--gcc/testsuite/g++.dg/overload/defarg8.C22
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();
+}
OpenPOWER on IntegriCloud