[PATCH] mixing of labels and code in C2X
Joseph Myers
joseph@codesourcery.com
Mon Sep 14 20:30:42 GMT 2020
On Sun, 13 Sep 2020, Uecker, Martin wrote:
> Hi Joseph,
>
> here is the (unfinished) patch to support
> mixing of labels in C2X.
I think there should be explicit tests for old standard versions
(c11-labels-1.c etc.) that these usages are errors with -pedantic-errors
with the old -std option, are warnings with -pedantic, and are quietly
accepted with neither. In addition to using -pedantic-errors with the new
standard version test to confirm it's not diagnosed, and a test with the
new version and -Wc11-c2x-compat.
By way of example of further places that I think need changing in the
patch: at present, c_parser_label gives an error (that you correctly
change to a pedwarn_c11) if the label is followed by a declaration - and
then parses the declaration itself rather than leaving it to be parsed in
the caller. So c_parser_compound_statement_nostart would parse a label
followed by a declaration, and at that point last_label would be set to
true, meaning that a second declaration would be rejected, when in C2x it
should be accepted. You can see this even without the patch with a test
such as:
void
f (void)
{
label : int a; int b;
}
I think that instead c_parser_label should never try to parse a
declaration following the label; that should be left for the caller to
handle. To avoid c_parser_label needing to return information about
standard attributes on a following declaration, maybe it shouldn't parse
standard attributes either (note that means that c_parser_all_labels would
need to handle parsing and warning about and discarding standard
attributes after each label instead - such attributes might be ones on a
statement, or ones on the next label in a sequence of labels).
Then of course the checks of last_label in
c_parser_compound_statement_nostart would need to become checks for
whether to pedwarn_c11 about the use of a label in a given context, once
the code knows whether there is a declaration, rather than preventing
parsing a declaration there at all. So probably c_parser_label would no
longer have the pedwarn_c11 either; that would all be left to its callers.
--
Joseph S. Myers
joseph@codesourcery.com
More information about the Gcc-patches
mailing list