On 02/21/2014 08:46 AM, Gopan wrote: > On Friday, 21 February 2014 at 14:04:45 UTC, FreeSlave wrote: >> Another strange thing: >> >> import std.stdio; >> >> uint Test() >> { >> if (!__ctfe) >> { >> return 3; >> } >> return 2; >> } >> >> >> >> void main() >> { >> immutable n = Test(); >> int[n] arr; >> writeln("arrary length = ", arr.length, " ; n = ", n); >> } >> >> Output: >> arrary length = 2 ; n = 3 >> >> When you think about it you understand that it's logically right >> behavior, but it's not acceptable in practice. > > It looks like 'immutable n = Test();' is executed during both compile > time and runtime. Is that what is happening?
Yes. The compiler needs the value of n at compile time so it evaluates it at compile time.
I agree that it is confusing but I feel like it is the responsibility of the programmer to ensure consistent behavior.
Ali