On 14.11.2010 1:21, bearophile wrote:
In a not-ranged cases body, like in the program below (that doesn't compile), the switch variable is a compile-time constant, so why doesn't the compile see x as constant there?
Well, there is fall-through ;) And there still could be goto's. In essence "case x:" is nothing but a glorified local label.
template Foo(uint x) { static if (x<= 1) enum Foo = 1; else enum Foo = x * Foo!(x - 1); } int bar(uint x) { switch (x) { case 0: return Foo!x; case 1: return Foo!x; case 2: return Foo!x; case 3: return Foo!x; case 4: return Foo!x; default: return -1; } } void main() { assert(bar(4) == 24); } That code works if I replace lines like: case 2: return Foo!x; With: case 2: return Foo!2; But when the code isn't DRY bugs may happen... (There are ten different better ways to write that program, but this is not the point). Bye, bearophile
-- Dmitry Olshansky