void foo(T)(T t) if(is(X == struct)) { } void main() { foo(4); }
This prints out: test.d(9): Error: template test.foo(T) if (is(X == struct)) does not match any function template declaration test.d(9): Error: template test.foo(T) if (is(X == struct)) cannot deduce template function from argument types !()(int) which is your typical template instantiation error. The real issue is that the symbol "X" doesn't actually exist. I've had a template I was refactoring and I've accidentally mistyped the name of the type, e.g.: void foo(T)(T r) if (is(T == struct) || is(t == class)) // t should have been T I was hoping for a better error message here. Can the compiler check that `is` has an expression with valid symbols in it?