struct Ma(T){
pure T alpha() const{ return 1.1; }
Ma opBinary(string op)(in Ma m) const if(op == "-"){ return Ma(m); }
}
struct Pa(T){
Ma!T _m;
alias _m this;
}
pure T foo(alias P, T)(in P!T p){ return (p - p).alpha(); }
void main(){
Pa!double p1;
foo(p1);
}
This is as far as I could narrow it down. Something starts to go wrong when 'opBinary' is called. Also, removing pure from 'foo' doesn't cause the seg fault.
DMD 2.56, Linux-64bit
Comment #1 by k.hara.pg — 2012-01-02T00:50:51Z
In 2.057 and later, following errors are raised:
test.d(17): Error: incompatible types for ((p) - (p)): 'const(Pa!(double))' and 'const(Pa!(double))'
test.d(22): Error: template instance test.foo!(Pa,double) error instantiating
Because, in Ma!T.opBinary(),
return Ma(m);
is not valid expression (it does not ignite copy construction).
After fixing it to
return Ma();
, the sample code compiles fine.