// Also possible (no change to the language) enum bool isInputRange(R) = is(typeof((ref R r) => r)) && msg("must be copyable")
Or how about enum bool isInputRange(R) = isCopyable!R && supportsBoolEmpty!R && supportsFront!R && supportsPopFront!R; and the compiler just calls out which condition didn't match?
&& is(typeof(lvalueOf!R.popFront)) && msg("must support back");
hey look you already messed up the string by repeating it.