Coming back to this...
On Tue, Jul 12, 2016 at 03:00:43PM -0600, Martin Sebor wrote:
> > This patch is accompanied by more than 2000 lines of new tests to get the
> > warning covered though I'm sure folks will come up with other test cases
> > that I hadn't considered (hi Martin S. ;).
> >
> > This warning is enabled by default for C/C++. I was more inclined to put
> > this
> > into -Wall, but our common.opt machinery doesn't seem to allow that (ugh!).
> > The clang version I have installed doesn't have this warning so I couldn't
> > compare my implementation with others.
> >
> > I plan to plunge into the C++ [[fallthrough]] thingie after this core part
> > is
> > dealt with.
>
> I think this is a useful feature though like others I'm not
> entirely sure that a built-in is the right interface. I think
> I would find a pragma or an attribute preferable. At a minimum,
> it would obviate some questions raised by my testing (i.e.,
> whether the built-in be accepted when an attribute would
> otherwise not be syntactically allowed).
>
> I applied the core patch and ran a few experiments with it on
> the assumption that __builtin_fallthrough() should behave roughly
> correspondingly to [[fallthrough]]. I.e., be rejected where
> [[fallthrough]] is rejected (but where attributes are otherwise
> valid) and be accepted where the latter is accepted. This may
> not be intended but the text added to the manual is too vague
> to tell. I also compared the results to Clang's [[fallthrough]]
> to make sure I wasn't missing something (or too much).
>
> I ran into a few of what seems like subtle bugs or limitations
> some of which I'm not sure are going to be solvable in the middle
> end (at least not after the control flow graph has been built)
> because by the time the middle end sees the code (certainly by
> the time it gets to expansion) some of it has been eliminated.
> An illustrative example of this class of problems might be this
> function:
>
> void f (void)
> {
> if (0) __builtin_fallthrough (); // never diagnosed
>
> int i = 0;
> if (i) __builtin_fallthrough (); // not diagnosed with -O
> }
>
> With the built-in replaced by [[fallthrough]] Clang diagnoses
> both of these.
>
> This may be an okay limitation for __builtin_fallthrough since
> it's GCC-specific, but it won't do for the C++ attribute or for
> the C attribute if one is added with matching constraints.
>
> The tests I tried are in the attached file. Most of them are
> edge cases but some I think point out more serious problems
> (the checker getting confused/disabled by a prior switch
> statement).
>
> Hopefully this will be useful.
Sure it is, thanks. Since I've replaced __builtin_fallthrough ()
with an attribute, most of your observations should be fixed now.
But there was an ICE happening even with __attribute__((fallthrough)),
which I fixed now. Your testcase is included (in a bit different
form) in the latest patch submission.
Marek