immutable int n = Test(); int[n] x;---- compiles, but __ctfe is false. How?

Gopan gggopan at gmail.com
Sun Feb 23 03:37:42 PST 2014


On Friday, 21 February 2014 at 17:04:45 UTC, Ali Çehreli wrote:
> 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.

Thanks for confirming this, Ali.

> I agree that it is confusing but I feel like it is the 
> responsibility of the programmer to ensure consistent behavior.
>
> Ali



More information about the Digitalmars-d-learn mailing list