Commit 49b5925f by Jason Merrill Committed by Jason Merrill

PR c++/72457 - ICE with list-value-initialized base.

	* 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
parent c63b1732
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
......
......@@ -391,6 +391,11 @@ build_data_member_initialization (tree t, vec<constructor_elt, va_gc> **vec)
gcc_assert (TREE_TYPE (member) == vtbl_ptr_type_node);
}
/* 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;
}
......
......@@ -1818,9 +1818,9 @@ expand_aggr_init_1 (tree binfo, tree true_exp, tree exp, tree init, int flags,
}
/* 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)
......
// 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{} {}
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment