In what order static if conditions are evaluated?
Timon Gehr
timon.gehr at gmx.ch
Fri Mar 29 06:54:02 PDT 2013
On 03/29/2013 12:33 PM, "Artur Zawłocki" <artur.zawlocki at gmail.com>" wrote:
> On Thursday, 28 March 2013 at 18:24:19 UTC, Timon Gehr wrote:
>
>> (...)
>> Indeed, the above code should not compile. My upcoming D front end
>> currently reports the following after fixing the grammatical mistakes
>> (For now. The error message text should maybe be improved. Ideas
>> welcome.)
>>
>> tt.d:2:32: error: declaration of 'x' smells suspiciously fishy
>> static if (!is(typeof(y))) int x = 1;
>> ^
>> tt.d:1:23: note: this lookup should have succeeded if it was valid
>> static if (!is(typeof(x))) int y = 1;
>> ^
>> tt.d:1:32: error: declaration of 'y' smells suspiciously fishy
>> static if (!is(typeof(x))) int y = 1;
>> ^
>> tt.d:2:23: note: this lookup should have succeeded if it was valid
>> static if (!is(typeof(y))) int x = 1;
>> ^
>
> Surely it will be fun to work with (though 'this lookup' message is
> somewhat confusing)!
>
Yes. What would be a better message?
>> There are lots of similar analysis order issues without static if.
>> (Luckily, they can be detected well enough conservatively in a quite
>> general way.) The following is a simplified example from my test suite:
>>
>> class A{ int string; }
>> template Mixin(string s){
>> mixin("alias "~s~" Mixin;");
>> }
>> class D: Mixin!({D d = new D; return d.foo();}()){
>> int foo(int x){ return 2;}
>> string foo(){ return "A"; }
>> }
>>
>> The problem is of course that 'string' has to be resolved in order to
>> compute the parent of 'D'. However, that parent then changes the
>> meaning of 'string' in the subclass scope. Therefore, the code is
>> meaningless.
>
> I am lost here. Are 'int string' in A
Yes.
> in and 'int foo(int)' in D
No.
> relevant?
> Shouldn't this example fail simply because in order to process
> the declaration of D the compiler needs to instantiate D in the delegate
> body?
No, D's parent is not required to be known in order to execute what is
in the delegate body.
> So this would be similar to:
>
> template Mixin(bool b : true) {
> alias Object Mixin;
> }
> class D: Mixin!(new D == new D) {}
>
>
This fails because new D == new D is false. (Otherwise it would work.)
More information about the Digitalmars-d
mailing list