diff options
author | Joseph Myers <jsm28@cam.ac.uk> | 2000-11-13 13:31:16 +0000 |
---|---|---|
committer | Joseph Myers <jsm28@gcc.gnu.org> | 2000-11-13 13:31:16 +0000 |
commit | 26d4fec72e0319f2af9416ceaa9c76430b9e808d (patch) | |
tree | 7f9d7597fc09c082ffe833c9bc59a6994331b0a1 | |
parent | 1173593dd6368a86253e21fcb00ff8496c0eac34 (diff) | |
download | gcc-26d4fec72e0319f2af9416ceaa9c76430b9e808d.zip gcc-26d4fec72e0319f2af9416ceaa9c76430b9e808d.tar.gz gcc-26d4fec72e0319f2af9416ceaa9c76430b9e808d.tar.bz2 |
c-parse.in (initelt): Give appropriate pedantic warnings...
* 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.
From-SVN: r37421
-rw-r--r-- | gcc/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/c-parse.in | 12 | ||||
-rw-r--r-- | gcc/c-typeck.c | 13 | ||||
-rw-r--r-- | gcc/extend.texi | 40 |
4 files changed, 53 insertions, 25 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7d2e387..c058f68 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,18 @@ 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): Add ATTRIBUTE_PRINTF. * tradcpp.c (v_message, warning, error, fatal, error_with_line): diff --git a/gcc/c-parse.in b/gcc/c-parse.in index ed272c8..3550bef 100644 --- a/gcc/c-parse.in +++ b/gcc/c-parse.in @@ -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 diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index 16dbc34..08523b5 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -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; } /* Add a new initializer to the tree of pending initializers. PURPOSE diff --git a/gcc/extend.texi b/gcc/extend.texi index 4f9bde7..573b36c 100644 --- a/gcc/extend.texi +++ b/gcc/extend.texi @@ -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 |