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
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.