https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84874
--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Reduced testcase: struct A { const char *a, *b; }; struct B { struct A c; }; void foo (B *x) { *x = { .c = { .b = "" } }; } *x = B { .c = { .b = "" } }; instead of *x = { .c = { .b = "" } }; works fine, but it is not reshape_init that adds the missing .a initializer. I wonder if we can just do: --- gcc/cp/decl.c.jj 2018-03-15 08:36:22.232776316 +0100 +++ gcc/cp/decl.c 2018-03-15 11:41:39.994485812 +0100 @@ -5885,8 +5885,13 @@ reshape_init_class (tree type, reshape_i return error_mark_node; if (TREE_CODE (d->cur->index) == FIELD_DECL) - /* We already reshaped this. */ - gcc_assert (d->cur->index == field); + { + /* We already reshaped this. */ + tree id = DECL_NAME (d->cur->index); + gcc_checking_assert (d->cur->index + == get_class_binding (type, id, false)); + field = d->cur->index; + } else if (TREE_CODE (d->cur->index) == IDENTIFIER_NODE) field = get_class_binding (type, d->cur->index, false); else or that without the gcc_checking_assert and tree id = ...;