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)!

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 in and 'int foo(int)' in D 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? So this would be similar to:

  template Mixin(bool b : true) {
    alias Object Mixin;
  }
  class D: Mixin!(new D == new D) {}


Artur

Reply via email to