mirror of
https://github.com/dlang/dmd.git
synced 2025-04-26 13:10:12 +03:00
98 lines
1.8 KiB
D
98 lines
1.8 KiB
D
/*
|
|
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);
|
|
}
|