I suspect there are multiple reasons for which the code below does not compile. It should, however, compile and run properly: auto max(T...)(T a) if (T.length == 2 && is(typeof(a[1] > a[0] ? a[1] : a[0])) || T.length > 2 && is(typeof(max(max(a[0], a[1]), a[2 .. $])))) { static if (T.length == 2) { return a[1] > a[0] ? a[1] : a[0]; } else { return max(max(a[0], a[1]), a[2 .. $]); } } void main() { assert(max(4, 5) == 5); assert(max(3, 4, 5) == 5); }
This is failing because 'a' isn't available while in the constraint.
(In reply to comment #1) > This is failing because 'a' isn't available while in the constraint. Exactly. The idea is that making the parameter names available would simplify writing template constraints a lot.
This is fixed by match to bug 3379. *** This issue has been marked as a duplicate of issue 3379 ***