+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):
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
;
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
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;
}
}
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
@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
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 @};
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
the following initialization
@example
-struct point p = @{ y: yvalue, x: xvalue @};
+struct point p = @{ .y = yvalue, .x = xvalue @};
@end example
@noindent
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
@example
union foo @{ int i; double d; @};
-union foo f = @{ d: 4 @};
+union foo f = @{ .d = 4 @};
@end example
@noindent
['\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