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.