[cfe-commits] r148640 - in /cfe/trunk: include/clang/Basic/DiagnosticGroups.td include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaStmt.cpp test/Sema/switch.c test/Sema/warn-unreachable.c test/SemaCXX/gnu-case-ranges.cpp test/SemaCXX/return-n

Fariborz Jahanian fjahanian at apple.com
Sat Jan 21 11:43:49 PST 2012


On Jan 21, 2012, at 11:16 AM, David Blaikie wrote:

> On Sat, Jan 21, 2012 at 11:02 AM, Fariborz Jahanian <fjahanian at apple.com> wrote:
>> 
>> On Jan 21, 2012, at 10:12 AM, David Blaikie wrote:
>> 
>>> Author: dblaikie
>>> Date: Sat Jan 21 12:12:07 2012
>>> New Revision: 148640
>>> 
>>> URL: http://llvm.org/viewvc/llvm-project?rev=148640&view=rev
>>> Log:
>>> Add -Wswitch-enum-redundant-default.
>>> 
>>> This warning acts as the complement to the main -Wswitch-enum warning (which
>>> warns whenever a switch over enum without a default doesn't cover all values of
>>> the enum) & has been an an-doc coding convention in LLVM and Clang in my
>>> experience. The purpose is to ensure there's never a "dead" default in a
>>> switch-over-enum because this would hide future -Wswitch-enum errors.
>> 
>> We have a related problem with -Wswitch-enum in clang. with this option a default should not turn
>> off the warning when default covers un-used case labels. Currently clang's behavior of --Wswitch and
>> -Wswitch-enum  are the same. I think fixing that will not make the new option necessary.
>> 
>> -Wswitch
>>           Warn whenever a "switch" statement has an index of enumerated type and lacks a "case" for one or
>>           more of the named codes of that enumeration.  (The presence of a "default" label prevents this
>>           warning.)  "case" labels outside the enumeration range also provoke warnings when this option is
>>           used.  This warning is enabled by -Wall.
>> 
>> -Wswitch-enum
>>           Warn whenever a "switch" statement has an index of enumerated type and lacks a "case" for one or
>>           more of the named codes of that enumeration.  "case" labels outside the enumeration range also
>>           provoke warnings when this option is used.
>> 
>> 
>> int test18() {
>>  enum { A, B } a;
>>  switch (a) {
>>  case A: return 0;
>>  default: return 2;
>> }
>> }
> 
> I'm not entirely sure I follow you - you mean that -Wswitch-enum
> should warn whenever there's a switch-over-enum that doesn't
> explicitly list all the enum values, even in the presence of a
> default? That seems like it would be very noisy/less valuable. There's
> often cases where one wants to handle an explicit subset of enum
> values & ignore the rest (granted, this case does devalue the switch
> warning).
> 
> I was wondering what the difference between -Wswitch and -Wswitch-enum
> was, but when I read the GCC docs it wasn't clear to me.
> 
> Now that I search again, the docs I found are more explicit and
> support your statement:
> 
> -Wswitch
>    Warn whenever a switch statement has an index of enumerated type
> and lacks a case for one or more of the named codes of that
> enumeration. (The presence of a default label prevents this warning.)
> case labels outside the enumeration range also provoke warnings when
> this option is used (even if there is a default label). This warning
> is enabled by -Wall.
> 
> -Wswitch-enum
>    Warn whenever a switch statement has an index of enumerated type
> and lacks a case for one or more of the named codes of that
> enumeration. case labels outside the enumeration range also provoke
> warnings when this option is used. The only difference between
> -Wswitch and this option is that this option gives a warning about an
> omitted enumeration code even if there is a default label.

Yes, clang currently treats -Wswitch-enum same as -Wswitch. Maybe, while you
are at it you can address this too. Once -Wswitch-enum is corrected, a "default' can no
longer hide missing case labels.

> 
> http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
> 
> So this would seem to say that the new warning I added is applicable
> to both -Wswitch and -Wswitch-enum. It's probably less valuable in the
> latter case - since, if you're using -Wswitch-enum, you don't need to
> worry about the presence or absence of 'default' labels as much. They
> might be unreachable code but they won't hide future mistakes.

Yes.

- Thanks, Fariborz

> 
> So to correct my statement in the patch,
> -Wswitch-enum-redundant-default is important for -Wswitch for those
> reasons, but not important for -Wswitch-enum because the latter will
> catch you regardless of the default.
> 
> (excuse the rambling reply - I think I found the right conclusion, though ;))
> 
> - David




More information about the cfe-commits mailing list