]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
* c-parse.in (initelt): Give appropriate pedantic warnings,
authorjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 13 Nov 2000 13:31:16 +0000 (13:31 +0000)
committerjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 13 Nov 2000 13:31:16 +0000 (13:31 +0000)
depending on flag_isoc99, for non-ISO syntax and for C99 syntax
outside C99 mode.
(designator): If pedantic, pedwarn for a designator specifying a
range of elements.
* c-typeck.c (set_init_index, set_init_label): Don't pedwarn for
these cases.
* extend.texi: Document the C99 syntax as the preferred syntax,
and the pre-2.5 syntax as obsolete.  Mention use of designator
lists for nested subobjects.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@37421 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/c-parse.in
gcc/c-typeck.c
gcc/extend.texi

index 7d2e387b4758bd273e74442646309a4213e16983..c058f68022e3834cce3dce8e50b1c4b195337d60 100644 (file)
@@ -1,3 +1,16 @@
+2000-11-13  Joseph S. Myers  <jsm28@cam.ac.uk>
+
+       * c-parse.in (initelt): Give appropriate pedantic warnings,
+       depending on flag_isoc99, for non-ISO syntax and for C99 syntax
+       outside C99 mode.
+       (designator): If pedantic, pedwarn for a designator specifying a
+       range of elements.
+       * c-typeck.c (set_init_index, set_init_label): Don't pedwarn for
+       these cases.
+       * extend.texi: Document the C99 syntax as the preferred syntax,
+       and the pre-2.5 syntax as obsolete.  Mention use of designator
+       lists for nested subobjects.
+
 2000-11-13  Joseph S. Myers  <jsm28@cam.ac.uk>
 
        * diagnostic.c (vbuild_message_string, output_do_printf, vnotice):
index ed272c8fe80c8ef97680c90e55aa86d93b3349c3..3550befcd4cfbce6756bd9c76195a11df0d864bf 100644 (file)
@@ -1132,9 +1132,15 @@ initlist1:
    It may use braces.  */
 initelt:
          designator_list '=' initval
+               { if (pedantic && ! flag_isoc99)
+                   pedwarn ("ISO C89 forbids specifying subobject to initialize"); }
        | designator initval
+               { if (pedantic)
+                   pedwarn ("obsolete use of designated initializer without `='"); }
        | identifier ':'
-               { set_init_label ($1); }
+               { set_init_label ($1);
+                 if (pedantic)
+                   pedwarn ("obsolete use of designated initializer with `:'"); }
          initval
        | initval
        ;
@@ -1162,7 +1168,9 @@ designator:
           so don't include these productions in the Objective-C grammar.  */
 ifc
        | '[' expr_no_commas ELLIPSIS expr_no_commas ']'
-               { set_init_index ($2, $4); }
+               { set_init_index ($2, $4);
+                 if (pedantic)
+                   pedwarn ("ISO C forbids specifying range of elements to initialize"); }
        | '[' expr_no_commas ']'
                { set_init_index ($2, NULL_TREE); }
 end ifc
index 16dbc34363b314c17c9aa6a7e32c2d6d435ee100..08523b5abf2859ab21eec9ad097cf9993d665623 100644 (file)
@@ -5438,12 +5438,7 @@ set_init_index (first, last)
       if (last != 0 && tree_int_cst_lt (last, first))
        error_init ("empty index range in initializer");
       else
-       {
-         if (pedantic)
-           pedwarn ("ISO C89 forbids specifying element to initialize");
-
-         constructor_range_end = last ? convert (bitsizetype, last) : 0;
-       }
+       constructor_range_end = last ? convert (bitsizetype, last) : 0;
     }
 }
 
@@ -5477,11 +5472,7 @@ set_init_label (fieldname)
     error ("field `%s' already initialized",
           IDENTIFIER_POINTER (fieldname));
   else
-    {
-      constructor_fields = tail;
-      if (pedantic)
-       pedwarn ("ISO C89 forbids specifying structure member to initialize");
-    }
+    constructor_fields = tail;
 }
 \f
 /* Add a new initializer to the tree of pending initializers.  PURPOSE
index 4f9bde737985a65f716ac236e29fc14c90b1f8b0..573b36cd331a84300a1336e307b5eab0738ce869 100644 (file)
@@ -1156,19 +1156,20 @@ to a cast.
 @cindex labeled elements in initializers
 @cindex case labels in initializers
 
-Standard C requires the elements of an initializer to appear in a fixed
+Standard C89 requires the elements of an initializer to appear in a fixed
 order, the same as the order of the elements in the array or structure
 being initialized.
 
-In GNU C you can give the elements in any order, specifying the array
-indices or structure field names they apply to.  This extension is not
+In ISO C99 you can give the elements in any order, specifying the array
+indices or structure field names they apply to, and GNU C allows this as
+an extension in C89 mode as well.  This extension is not
 implemented in GNU C++.
 
-To specify an array index, write @samp{[@var{index}]} or
+To specify an array index, write
 @samp{[@var{index}] =} before the element value.  For example,
 
 @example
-int a[6] = @{ [4] 29, [2] = 15 @};
+int a[6] = @{ [4] 29, [2] = 15 @};
 @end example
 
 @noindent
@@ -1182,8 +1183,13 @@ int a[6] = @{ 0, 0, 15, 0, 29, 0 @};
 The index values must be constant expressions, even if the array being
 initialized is automatic.
 
+An alternative syntax for this which has been obsolete since GCC 2.5 but
+GCC still accepts is to write @samp{[@var{index}]} before the element
+value, with no @samp{=}.
+
 To initialize a range of elements to the same value, write
-@samp{[@var{first} ... @var{last}] = @var{value}}.  For example,
+@samp{[@var{first} ... @var{last}] = @var{value}}.  This is a GNU
+extension.  For example,
 
 @example
 int widths[] = @{ [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 @};
@@ -1194,7 +1200,7 @@ Note that the length of the array is the highest value specified
 plus one.
 
 In a structure initializer, specify the name of a field to initialize
-with @samp{@var{fieldname}:} before the element value.  For example,
+with @samp{.@var{fieldname} =} before the element value.  For example,
 given the following structure,
 
 @example
@@ -1205,7 +1211,7 @@ struct point @{ int x, y; @};
 the following initialization
 
 @example
-struct point p = @{ y: yvalue, x: xvalue @};
+struct point p = @{ .y = yvalue, .x = xvalue @};
 @end example
 
 @noindent
@@ -1215,11 +1221,11 @@ is equivalent to
 struct point p = @{ xvalue, yvalue @};
 @end example
 
-Another syntax which has the same meaning is @samp{.@var{fieldname} =}.,
-as shown here:
+Another syntax which has the same meaning, obsolete since GCC 2.5, is
+@samp{@var{fieldname}:}, as shown here:
 
 @example
-struct point p = @{ .y = yvalue, .x = xvalue @};
+struct point p = @{ y: yvalue, x: xvalue @};
 @end example
 
 You can also use an element label (with either the colon syntax or the
@@ -1229,7 +1235,7 @@ of the union should be used.  For example,
 @example
 union foo @{ int i; double d; @};
 
-union foo f = @{ d: 4 @};
+union foo f = @{ .d = 4 @};
 @end example
 
 @noindent
@@ -1264,6 +1270,16 @@ int whitespace[256]
       ['\f'] = 1, ['\n'] = 1, ['\r'] = 1 @};
 @end example
 
+You can also write a series of @samp{.@var{fieldname}} and
+@samp{[@var{index}]} element labels before an @samp{=} to specify a
+nested subobject to initialize; the list is taken relative to the
+subobject corresponding to the closest surrounding brace pair.  For
+example, with the @samp{struct point} declaration above:
+
+@example
+struct point ptarray[10] = @{ [2].y = yv2, [2].x = xv2, [0].x = xv0 @};
+@end example
+
 @node Case Ranges
 @section Case Ranges
 @cindex case ranges