re PR c++/60417 ([DR 1518] Bogus error on C++03 aggregate initialization)
authorJason Merrill <jason@redhat.com>
Tue, 4 Mar 2014 22:16:12 +0000 (17:16 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 4 Mar 2014 22:16:12 +0000 (17:16 -0500)
PR c++/60417
* typeck2.c (process_init_constructor_record): Set
CONSTRUCTOR_IS_DIRECT_INIT on {} for omitted initializers.

From-SVN: r208333

gcc/cp/ChangeLog
gcc/cp/typeck2.c
gcc/testsuite/g++.dg/init/explicit1.C [new file with mode: 0644]

index 2ad6b7a..6f2b38a 100644 (file)
@@ -1,5 +1,9 @@
 2014-03-04  Jason Merrill  <jason@redhat.com>
 
+       PR c++/60417
+       * typeck2.c (process_init_constructor_record): Set
+       CONSTRUCTOR_IS_DIRECT_INIT on {} for omitted initializers.
+
        PR c++/60415
        PR c++/54359
        * parser.c (cp_parser_direct_declarator): Set declarator to
index 8877286..3a4caa0 100644 (file)
@@ -1312,6 +1312,9 @@ process_init_constructor_record (tree type, tree init,
             for us, so build up TARGET_EXPRs.  If the type in question is
             a class, just build one up; if it's an array, recurse.  */
          next = build_constructor (init_list_type_node, NULL);
+         /* Call this direct-initialization pending DR 1518 resolution so
+            that explicit default ctors don't break valid C++03 code.  */
+         CONSTRUCTOR_IS_DIRECT_INIT (next) = true;
          next = massage_init_elt (TREE_TYPE (field), next, complain);
 
          /* Warn when some struct elements are implicitly initialized.  */
diff --git a/gcc/testsuite/g++.dg/init/explicit1.C b/gcc/testsuite/g++.dg/init/explicit1.C
new file mode 100644 (file)
index 0000000..f376df2
--- /dev/null
@@ -0,0 +1,9 @@
+// PR c++/60417
+
+struct A { explicit A(int = 0); };
+struct B { A a; };
+
+int main()
+{
+  B b = {};
+}