* init.c (expand_aggr_init_1): Only handle value-init of bases.
* constexpr.c (build_data_member_initialization): Handle multiple
initializers for the same field.
From-SVN: r238867
+2016-07-29 Jason Merrill <jason@redhat.com>
+
+ PR c++/72457
+ * init.c (expand_aggr_init_1): Only handle value-init of bases.
+ * constexpr.c (build_data_member_initialization): Handle multiple
+ initializers for the same field.
+
2016-07-28 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/71665
gcc_assert (TREE_TYPE (member) == vtbl_ptr_type_node);
}
- CONSTRUCTOR_APPEND_ELT (*vec, member, init);
+ /* Value-initialization can produce multiple initializers for the
+ same field; use the last one. */
+ if (!vec_safe_is_empty (*vec) && (*vec)->last().index == member)
+ (*vec)->last().value = init;
+ else
+ CONSTRUCTOR_APPEND_ELT (*vec, member, init);
return true;
}
}
/* List-initialization from {} becomes value-initialization for non-aggregate
- classes with default constructors. Handle this here so protected access
- works. */
- if (init && TREE_CODE (init) == TREE_LIST)
+ classes with default constructors. Handle this here when we're
+ initializing a base, so protected access works. */
+ if (exp != true_exp && init && TREE_CODE (init) == TREE_LIST)
{
tree elt = TREE_VALUE (init);
if (DIRECT_LIST_INIT_P (elt)
--- /dev/null
+// PR c++/72457
+// { dg-do compile { target c++11 } }
+
+struct A {
+ int i;
+ constexpr A(): i(0) {}
+};
+
+struct B: A { };
+
+struct C
+{
+ B b;
+ constexpr C() : b{} {}
+};