https://issues.dlang.org/show_bug.cgi?id=18712
Walter Bright <[email protected]> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |RESOLVED Resolution|--- |WONTFIX --- Comment #4 from Walter Bright <[email protected]> --- Here's what's happening. After a case/default statement, the parser makes the code between one case/default and the next into a scope. So it looks like: int test(int n) { switch(n) { mixin("case 0:"); int x = 1; return x; case 1: { int y = 2; return y; } default: { return -1; } } } and, of course, now the error message makes sense. `x` is visible to the following two scopes, whether or not the error message is generated. Any time the case/default is not directly in the switch body (not nested via { } or a mixin) the implicit { } scope is not generated. Oops. Try putting { } in various combinations, and you'll see how it all comes unglued. I can't think of any solution that 1) works in all cases and 2) doesn't break a lot of existing code. So we're just stuck with it. Fortunately, there is a workaround. Recode the switch like this: int test(int n) { switch(n) { mixin("case 0:"); { int x = 1; return x; } case 1: int y = 2; return y; default: return -1; } } I'm going to close this as WONTFIX. If anyone has a brainwave on how to make it work in all cases without breaking code, reopen with proof. Note that the fundamental problem is a combination of: 1. allowing case/default statements to appear inside nested scopes 2. implicit generation of scopes between case/default pairs --
