[PATCH] Warn on empty switch statements

Reid Kleckner rnk at google.com
Mon Jun 3 09:30:52 PDT 2013


Should this have a -W flag?  Should it be on or off by default?

If we're not sure about how valuable this warning is, then we need a flag
to turn it off.  Then, there is a maintenance cost associated with adding
more -W flags.

The kinds of time wasters I used to hit are probably covered by
-Wconversion and -Wsign-compare, but I never turned them on.

If people agree that there is value to having a mode that tries (best
effort, not guaranteed) to warn when MSVC would, what about adding a flag
that groups these together?  Like -Wmsvc-[123].  Then if we implemented a
cl.exe compatible driver, we'd just alias /W3 to it.  And people could use
clang without breaking 'cl /W[123] /Wx' builds.

Then this switch warning and others like it could go under -Wmsvc-3,
without leading to a proliferation of -Wreally-obscure-warning flags.

I don't think you'd want to take this as far as maintaining a mapping of
numbered MSVC warnings to clang warnings.  If someone is using 'cl.exe /W3
/wd...' they can come up with an equivalent expression in clang flags.


On Mon, Jun 3, 2013 at 11:23 AM, Aaron Ballman <aaron at aaronballman.com>wrote:

> Ping?
>
> I've given this some more thought, and I feel like Reid and Daniel (in
> the PR) hit the nail on the head: it is really nice to be able to
> write code in clang and not have to worry that I've introduced a
> warning in MSVC, especially since I try to compile everything with
> warnings as errors.  I understand the fear of trying to match
> diagnostics with other compilers, but where's the harm if it's not
> overly chatty and it can catch bugs?
>
> Also, I think the warning adds value over the empty statement warning
> because the situations are different.  Eg)
>
> switch (expr);  // Should warn because the ; is suspicious
> {
>   /* stuff */
> }
>
> // vs
>
> switch (expr) {
>   /* ToDo: finish this */
> }  // Should warn because the emptiness of the block is suspicious
>
>
> In the case where the user really does want an empty switch statement,
> they can selectively turn the diagnostic off.  This really shouldn't
> be a common case, after all.
>
> ~Aaron
>
> On Wed, May 29, 2013 at 4:10 PM, Reid Kleckner <rnk at google.com> wrote:
> > On Wed, May 29, 2013 at 3:49 PM, Richard Smith <richard at metafoo.co.uk>
> > wrote:
> >>
> >> On Wed, May 29, 2013 at 7:35 AM, Aaron Ballman <aaron at aaronballman.com>
> >> wrote:
> >>>
> >>> -Wunreachable-code doesn't warn on empty statement bodies for the
> >>> switch.  So, for instance:
> >>>
> >>> int main() {
> >>>   int i = 0;
> >>>   switch(i) {}
> >>> }
> >>>
> >>> yields no warnings in clang with -Wunreachable-code (or -Wall), but at
> >>> /W3 in MSVC you get: warning C4060: switch statement contains no
> >>> 'case' or 'default' labels.  Will it catch lots of bugs?  Probably
> >>> not.  But it also should have basically no false positives either.  It
> >>> would be nice for people who want their code to also be warning-free
> >>> under MSVC.
> >>
> >>
> >> I think we need more justification for adding the warning than this.
> >>
> >> It doesn't seem reasonable to expect us to implement the union of all
> >> warnings which every existent compiler produces. Some of those warnings
> are
> >> really dumb. For instance, /W3 also enables C4800, which I don't think
> we
> >> will ever want to implement.
> >
> >
> > I agree that warning (forcing value to bool) is really, really bad, and I
> > hope most serious projects turn it off.
> >
> > However, I can say it's pretty annoying if you're working on
> cross-platform
> > project and have to push to another platform to build just to get some
> > compiler warnings for a compiler which you're expected to keep warning
> > clean, value judgements about its diagnostic quality aside.  That cycle
> is
> > long and painful, and if you skip it people often yell at you.
> >
> > While clang will never be able to paper over the differences between
> > platforms, having some off-by-default diagnostics like this could save
> users
> > some time and increase the likelihood that their changes Just Work on the
> > first push.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130603/1ba1cfbe/attachment.html>


More information about the cfe-commits mailing list