Switch case falltrhough, regression or intended behavior ?

Stewart Gordon smjg_1998 at yahoo.com
Sun Feb 17 17:04:41 PST 2013


On 17/02/2013 20:07, Jonathan M Davis wrote:
<snip>
>> Implicit fall through shouldn't have been allowed from the beginning.  It
>> would appear that this has finally been banned.
>
> Implicit fallthrough is a warning when a case stament is non-empty, but if
> it's empty (as in the example), then there is no warning.

What version of DMD are you using?

I'm getting stranger than this (2.061):

----- switch_fallthrough_a.d -----
void main() {
     char c = 'x';
     switch(c) {
         case 'U', 'u' :
         case 'L', 'l' :
             // code . . .
         default:
     }
}
----- switch_fallthrough_b.d -----
void main() {
     char c = 'x';
     switch(c) {
         case 'U', 'u' :
             c = 'q';
         case 'L', 'l' :
             c = 'r';
             // code . . .
         default:
     }
}
----------
C:\Users\Stewart\Documents\Programming\D\Tests>dmd switch_fallthrough_a.d

C:\Users\Stewart\Documents\Programming\D\Tests>dmd -w switch_fallthrough_a.d
switch_fallthrough_a.d(5): Error: switch case fallthrough - use 'goto case;' if intended
switch_fallthrough_a.d(7): Error: switch case fallthrough - use 'goto default;' if intended

C:\Users\Stewart\Documents\Programming\D\Tests>dmd switch_fallthrough_b.d

C:\Users\Stewart\Documents\Programming\D\Tests>dmd -w switch_fallthrough_b.d
switch_fallthrough_b.d(6): Error: switch case fallthrough - use 'goto case;' if intended
switch_fallthrough_b.d(9): Error: switch case fallthrough - use 'goto default;' if intended
----------

You see, it's independent of whether there are any statements between the two case 
markers, and there's a further anomaly in that it's an _error_ that's emitted only if 
_warnings_ are enabled.

> If the compiler is warning about falling through an empty case statement, it's a bug.

There's no such thing as an "empty case statement", unless you mean the case where the 
ScopeStatementList is ";" or "{}" by itself.  Look at the grammar carefully.

So by the current spec, the first example is a syntax error, since a CaseStatement 
explicitly forbids another CaseStatement as its body.

Stewart.


More information about the Digitalmars-d mailing list