Cannot compile following code: // receive only rvalue void rvalue(T)(auto ref T x) if (!__traits(isRef, x)) {} // receive only lvalue void lvalue(T)(auto ref T x) if ( __traits(isRef, x)) {} void main() { int n; static assert(!__traits(compiles, rvalue(n))); static assert( __traits(compiles, rvalue(0))); static assert( __traits(compiles, lvalue(n))); static assert(!__traits(compiles, lvalue(0))); }
https://github.com/D-Programming-Language/dmd/commit/407cd0fa8bfe7443302bbf460d56a1e1847c5c01
Sorry my patch is incomplete, because it does not support auto ref tuple parameter. void rvalueVargs(T...)(auto ref T x) if (!__traits(isRef, x[0])) {} void lvalueVargs(T...)(auto ref T x) if ( __traits(isRef, x[0])) {} void test6404() { int n; static assert(!__traits(compiles, rvalueVargs(n))); static assert( __traits(compiles, rvalueVargs(0))); static assert( __traits(compiles, lvalueVargs(n))); static assert(!__traits(compiles, lvalueVargs(0))); }
Retry to fix it. https://github.com/D-Programming-Language/dmd/pull/285
https://github.com/D-Programming-Language/dmd/commit/91debf464f8b6c49a0d522d10fce285ad1a5f9e7
I think it would be neat to extend this to IsExpressions. void foo()(auto ref int val) if (is(typeof(val) == ref))