diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 5c3df09b5f3..1e157f79299 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -7551,11 +7551,24 @@ reshape_init (tree type, tree *initp) { /* Loop through the initializable fields, gathering initializers. */ - /* FIXME support non-trivial labeled initializers. */ - while (*initp && field) + while (*initp) { tree field_init; + /* Handle designated initializers, as an extension. */ + if (TREE_PURPOSE (*initp)) + { + if (pedantic) + pedwarn ("ISO C++ does not allow designated initializers"); + field = lookup_field_1 (type, TREE_PURPOSE (*initp), + /*want_type=*/false); + if (!field || TREE_CODE (field) != FIELD_DECL) + error ("`%T' has no non-static data member named `%D'", + type, TREE_PURPOSE (*initp)); + } + if (!field) + break; + field_init = reshape_init (TREE_TYPE (field), initp); TREE_CHAIN (field_init) = CONSTRUCTOR_ELTS (new_init); CONSTRUCTOR_ELTS (new_init) = field_init;