Implement -Wimplicit-fallthrough (take 3)

Marek Polacek polacek@redhat.com
Fri Aug 19 12:46:00 GMT 2016


On Thu, Aug 18, 2016 at 01:07:26PM -0400, David Malcolm wrote:
> On Thu, 2016-08-18 at 15:50 +0200, Marek Polacek wrote:
> > Now that all various switch fallthrough bugfixes and adjustments were
> > committed, and this patch has shrunk considerably, I'm presenting the
> > latest
> > version.  The changes from the last version are not huge; we don't
> > warn for a
> > fall through to a user-defined label anymore, and I made some tiny
> > changes
> > regarding parsing attributes in the C FE, as requested by Joseph.
> > 
> > This patch is accompanied by another patch that merely adds various
> > gcc_fallthroughs, in places where a FALLTHRU comment wouldn't work.
> > 
> > It's been tested on powerpc64le-unknown-linux-gnu, aarch64-linux-gnu,
> > and x86_64-redhat-linux.
> > 
> > 2016-08-18  Marek Polacek  <polacek@redhat.com>
> > 	    Jakub Jelinek  <jakub@redhat.com>
> > 
> > 	PR c/7652
> 
> [...]
>  
> > diff --git gcc/gcc/gimplify.c gcc/gcc/gimplify.c
> > index 1e43dbb..1925263 100644
> > --- gcc/gcc/gimplify.c
> > +++ gcc/gcc/gimplify.c
> 
> [...]
> 
> > +	    if (warned_p)
> > +	      {
> > +		rich_location richloc (line_table, gimple_location
> > (next));
> > +		richloc.add_fixit_insert (gimple_location (next),
> > +					  "insert '__attribute__ "
> > +					  "((fallthrough));' to
> > silence "
> > +					  "this warning");
> > +		richloc.add_fixit_insert (gimple_location (next),
> > +					  "insert 'break;' to avoid
> > "
> > +					  "fall-through");
> > +		inform_at_rich_loc (&richloc, "here");
> > +	      }
> 
> This isn't quite the way that fix-its are meant to be used, in my mind,
> at least: the insertion text is supposed to be something that could be
> literally inserted into the code (e.g. by an IDE) i.e. it should be a
> code fragment, rather than a message to the user.
> 
> Here's an idea of how the above could look:
> 
>   if (warned_p)
>     {
>       /* Suggestion one: add "__attribute__ ((fallthrough));".  */
>       rich_location richloc_attr (line_table, gimple_location (next));
>       richloc_attr.add_fixit_insert (gimple_location (next),
>                                      "__attribute__ ((fallthrough));");
>       inform_at_rich_loc (&richloc_attr, "insert %qs to silence this warning",
>                           "__attribute__ ((fallthrough));")
> 
>       /* Suggestion two: add "break;".  */
>       rich_location richloc_break (line_table, gimple_location (next));
>       richloc_break.add_fixit_insert (gimple_location (next),
>                                       "break;");
>       inform_at_rich_loc (&richloc_break, "insert %qs to avoid fall-through",
>                           "break;");
>     }
> 
> 
> (and using %qs for quoting the language elements in the messages
> themselves).
 
Thanks for the clarification, I made it so and the output looks *much* better.

> There doesn't seem to be any test coverage in the patch for the fix-it
> hints.
> 
> The easiest way to do this is to create a test case with:
> 
> /* { dg-options "-fdiagnostics-show-caret" } */
> 
> and then add:
> 
>  /* { dg-begin-multiline-output "" }
> QUOTE OF EXPECTED CARET+FIXIT OUTPUT, omitting any trailing deja-gnu
> directives
>      { dg-end-multiline-output "" } */
> 
> so that we can directly verify that the results look sane.
 
Ok, I added a testcase testing multiline comments.

> BTW, is there some way to break up warn_implicit_fallthrough_r, maybe
> moving the GIMPLE_LABEL handling to a subroutine? (and perhaps the
> suggestion-handling above could live in its own subroutine, etc).

Let me try to split it up a bit.

Thanks,

	Marek



More information about the Gcc-patches mailing list