PR c++/82336 - link error with list-init default argument.
authorPaolo Carlini <paolo.carlini@oracle.com>
Wed, 14 Mar 2018 01:03:13 +0000 (01:03 +0000)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 14 Mar 2018 01:03:13 +0000 (21:03 -0400)
* decl.c (check_default_argument): Unshare an initializer list.

Co-Authored-By: Jason Merrill <jason@redhat.com>
From-SVN: r258512

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/g++.dg/cpp0x/initlist-defarg2.C [new file with mode: 0644]

index 09dc2b1ac1229d8226361aa482cd2c977f49b7bc..71fba7518072238a785e3dd4080500da7d856d5d 100644 (file)
@@ -1,3 +1,9 @@
+2018-03-13  Paolo Carlini  <paolo.carlini@oracle.com>
+           Jason Merrill  <jason@redhat.com>
+
+       PR c++/82336 - link error with list-init default argument.
+       * decl.c (check_default_argument): Unshare an initializer list.
+
 2018-03-13  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/84843
index ff6dd66e7693d579d2222bc7916113065353dd03..45daccda9164d11c7235f71c40a4dc4eb277eece 100644 (file)
@@ -12668,7 +12668,9 @@ check_default_argument (tree decl, tree arg, tsubst_flags_t complain)
      A default argument expression is implicitly converted to the
      parameter type.  */
   ++cp_unevaluated_operand;
-  perform_implicit_conversion_flags (decl_type, arg, complain,
+  /* Avoid digest_init clobbering the initializer.  */
+  tree carg = BRACE_ENCLOSED_INITIALIZER_P (arg) ? unshare_expr (arg): arg;
+  perform_implicit_conversion_flags (decl_type, carg, complain,
                                     LOOKUP_IMPLICIT);
   --cp_unevaluated_operand;
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-defarg2.C b/gcc/testsuite/g++.dg/cpp0x/initlist-defarg2.C
new file mode 100644 (file)
index 0000000..6524035
--- /dev/null
@@ -0,0 +1,8 @@
+// PR c++/82336
+// { dg-do link { target c++11 } }
+
+struct foo { int x = 5; };
+struct bar : foo { bar() = default; };
+struct baz { bar x; };
+void qux(baz = {}){}
+int main() { qux(); }