re PR c++/10515 (problem when initializing a field in a union)
authorMark Mitchell <mmitchel@gcc.gnu.org>
Tue, 29 Apr 2003 18:26:47 +0000 (18:26 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Tue, 29 Apr 2003 18:26:47 +0000 (18:26 +0000)
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

index 5c3df09b5f3bbccd6f4374d629bf0f02abe90274..1e157f79299ee4a59afd10fc86e190ad3def5ea2 100644 (file)
@@ -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;