/* PERMUTE_ARGS: */ version (with_phobos) import std.conv : text; struct Tuple(T...) { T expand; alias expand this; } auto tuple(T...)(T t) { return Tuple!T(t); } void fun0(U, T...)(U gold, int b_gold, T a, int b) { assert(tuple(a) == gold); assert(b == b_gold); } void fun(U, T...)(U gold, T a, int b = 1) { assert(tuple(a) == gold); assert(b == 1); } void fun2(U, V, T...)(U gold, V gold2, T a, string file = __FILE__, int line = __LINE__) { assert(tuple(a) == gold); assert(tuple(file, line) == gold2); } void fun3(int[] gold, int[] a...) { assert(gold == a); } void fun4(T...)(size_t length_gold, int b_gold, T a, int b = 1) { assert(T.length == length_gold); assert(b == b_gold); } // Example in changelog string log(T...)(T a, string file = __FILE__, int line = __LINE__) { return text(file, ":", line, " ", a); } void fun_constraint(T...)(T a, string b = "bar") if (T.length == 1) { } /+ NOTE: this is disallowed by the parser: void fun5(int[] gold, int[] a ..., int b = 1) { assert(gold==a); assert(b==1); } +/ void main() { fun0(tuple(10), 7, 10, 7); fun(tuple()); fun(tuple(10), 10); fun(tuple(10, 11), 10, 11); fun2(tuple(10), tuple(__FILE__, __LINE__), 10); fun3([1, 2, 3], 1, 2, 3); fun_constraint(1); assert(!__traits(compiles, fun_constraint(1, "baz"))); version (with_phobos) assert(log(10, "abc") == text(__FILE__, ":", __LINE__, " 10abc")); // IFTI: `b` is always default-set fun4(0, 1); fun4(1, 1, 10); fun4(2, 1, 10, 11); // with explicit instantiation, and default-set `b` fun4!int(1, 1, 10); fun4!(int, int)(2, 1, 10, 11); // with explicit instantiation, and over-ridden `b` fun4!int(1, 100, 10, 100); fun4!(int, int)(2, 100, 10, 11, 100); // fun5([1,2,3], 1,2,3); }