From 446d5e4776fad70c34500b531688b1d5b24d7065 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Tue, 29 Apr 2003 18:26:47 +0000 Subject: [PATCH] re PR c++/10515 (problem when initializing a field in a union) PR c++/10515 * cp-tree.h (lookup_field_1): Declare it. * search.c (lookup_field_1): Make it public. * decl.c (reshape_init): Handle designated initializers. From-SVN: r66236 --- gcc/cp/decl.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) 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;