If we do create such an initializer, we end up with an error_mark_node during gimplification, because in cp-gimplify.c we pass this VEC_INIT_EXPR of the flexible array member to build_vec_init, for which it spits on an error_mark_node. This happens in e.g. the test case g++.dg/ext/array1.C.
This patch makes it so that we avoid generating an initializer for a flexible array member, thus avoiding to end up with an error_mark_node during gimplification. The same kind of thing is done ~90 lines down from the code I changed. gcc/cp/ChangeLog: * init.c (perform_member_init): Avoid creating an initializer for a flexible array member. --- gcc/cp/init.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 09c1183..0011178 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -645,9 +645,14 @@ perform_member_init (tree member, tree init) /* mem() means value-initialization. */ if (TREE_CODE (type) == ARRAY_TYPE) { - init = build_vec_init_expr (type, init, tf_warning_or_error); - init = build2 (INIT_EXPR, type, decl, init); - finish_expr_stmt (init); + /* Initialize the array only if it's not a flexible + array member (i.e., if it has an upper bound). */ + if (TYPE_DOMAIN (type) && TYPE_MAX_VALUE (TYPE_DOMAIN (type))) + { + init = build_vec_init_expr (type, init, tf_warning_or_error); + init = build2 (INIT_EXPR, type, decl, init); + finish_expr_stmt (init); + } } else { -- 2.7.0.rc3.56.g64157c6.dirty