About switch case statements...

Don nospam at nospam.com
Sun Nov 15 11:50:24 PST 2009


Andrei Alexandrescu wrote:
> Chad J wrote:
>> So, switch-case statements are a frequent source of nasty bugs.  Fixing
>> them (well) requires breaking backwards compatibility.
>>
>> Any chance this will happen for D2?
>>
>> (This is intended as more of a reminder and simple curiosity than a
>> discussion.)
> 
> I wish very much that a transferring control flow statement (break, 
> return, goto etc.) is required at the end of each case. Then, the rare 
> case when you want to break through is easy to implement as goto case 
> xxx; and all is good.
> 
> Walter's answer to that has put me to silence for good. "But I use 
> fall-through all the time!" I then knew the feature will never make it.

Walter definitely *thinks* he uses fall-through all of the time. BUT...
Does he *really* use it all the time? It's not a matter of opinion; it's 
an objective question, answerable since so much of his code is now 
publically available. I got a bit interested in knowing how much he does 
use it.

I consider that fallthrough requires a non-empty statement. IE,
case A:
case B:
case C:
      dosomething();
      break;

is not a real fallthrough; those would always be allowed.

I looked through a couple of DMD files: parse.c, (the parser), and 
cod3.c (the largest file in the back-end).
In cod3, there are 381 case statements. There are 3 occasions where 
fallthrough is used. In two of those cases, they fallthrough to a label 
where other cases have 'goto' that label. In the remaining case, the 
code which was fallen through was an assert and a debug print statement.

parse.c has 541 case statements, I didn't find any fallthroughs in the 
first half of the code, but I didn't look as thoroughly as I did in cod3.

Based on this, it looks to me as though Walter uses fall-through very, 
very rarely. Less than 1% of all case statements.
For comparison, those files contain 178 and 137 gotos, respectively <g>.
Walter does use 'goto'. He doesn't use fallthrough in switch statements.

It's actually not something I care about at all. But I think Walter's 
wrong about his coding style. And looking at how rarely it's actually 
used by someone who thinks he uses it a lot, convinces me that 
intentional use of fall-through is much less common than bugs introduced 
by leaving out a break statement.

An interesting result.
But I'd much rather change Walter's mind about opPow() or the 
meta.compiles(XXX) proposal.



More information about the Digitalmars-d mailing list