On Mon, Aug 11, 2014 at 08:19:52PM +0000, Joseph S. Myers wrote:
> On Sat, 9 Aug 2014, Marek Polacek wrote:
>
> > + /* Maybe we want to issue the C90/C99 compat warning, which is more
> > + specific than -pedantic. */
> > + if (warn_c90_c99_compat > 0)
> > {
> > diagnostic_set_info (&diagnostic, gmsgid, &ap, location, DK_WARNING);
>
> That seems wrong; it means that -Wc90-c99-compat turns errors from
> -pedantic-errors into warnings. E.g.
>
> const const int i;
>
> with -std=c90 -pedantic-errors gets an error, but (with this patch
> applied) with -Wc90-c99-compat it becomes a warning.
>
> (In view of this problem I haven't reviewed the rest of this patch.)
Ah, ok, I thought that this is desirable. I'll adjust it.
> > diff --git gcc/gcc/c/c-parser.c gcc/gcc/c/c-parser.c
> > index ca8577c..454f279 100644
> > --- gcc/gcc/c/c-parser.c
> > +++ gcc/gcc/c/c-parser.c
> > @@ -1073,7 +1073,10 @@ disable_extension_diagnostics (void)
> > | (warn_long_long << 4)
> > | (warn_cxx_compat << 5)
> > | (warn_overlength_strings << 6)
> > - | (warn_c90_c99_compat << 7));
> > + /* warn_c90_c99_compat has three states: -1/0/1, so we must
> > + play tricks to properly restore it. */
> > + | (warn_c90_c99_compat << 7)
> > + | ((warn_c90_c99_compat == -1) << 8));
>
> This doesn't make sense to me either. You're left-shifting a negative
> value (undefined behavior in ISO C, so should be avoided anyway), and left
> shifting -1 means that all the bits to the left of bit 7 in the result
> will also be set so can't be used to carry any other information (in
> particular bit 8 will be set, so this code will in fact work, but by
> accident).
Oops, sneaky. I haven't noticed that when I made warn_c90_c99_compat be
initialized to -1 :(.
The patch for -Wc99-c11-compat I posted today has the same issues, so
please ignore that one for now - I'll send a better version tomorrow.
Marek