blob: 36baef532318d0d0c08d815aa7c7af95f29e9083 [file] [log] [blame]
//https://issues.dlang.org/show_bug.cgi?id=22291
alias AliasSeq(T...) = T;
void noParameters()
{
static assert(typeof(__traits(parameters)).length == 0);
}
void noArgs()
{
//Arguments are not valid, this should not compile
static assert(!__traits(compiles, __traits(parameters, 456)));
}
shared static this()
{
static assert(typeof(__traits(parameters)).length == 0);
}
int echoPlusOne(int x)
{
__traits(parameters)[0] += 1;
return x;
}
static assert(echoPlusOne(1) == 2);
void nesting(double d, int i)
{
alias EXP = AliasSeq!(d, i);
if (d)
{
static assert(__traits(isSame, __traits(parameters), EXP));
while (d)
{
static assert(__traits(isSame, __traits(parameters), EXP));
switch (i)
{
static assert(__traits(isSame, __traits(parameters), EXP));
case 1:
static assert(__traits(isSame, __traits(parameters), EXP));
break;
default:
static assert(__traits(isSame, __traits(parameters), EXP));
break;
}
}
}
}
class Tree {
int opApply(int delegate(size_t, Tree) dg) {
if (dg(0, this)) return 1;
return 0;
}
}
void useOpApply(Tree top, int x)
{
foreach(idx; 0..5)
{
static assert(is(typeof(__traits(parameters)) == AliasSeq!(Tree, int)));
}
foreach(idx, elem; top)
{
static assert(is(typeof(__traits(parameters)) == AliasSeq!(Tree, int)));
}
foreach(idx, elem; top)
{
foreach (idx2, elem2; elem)
static assert(is(typeof(__traits(parameters)) == AliasSeq!(Tree, int)));
}
foreach(idx, elem; top)
{
static void foo(char[] text)
{
foreach (const char c; text)
static assert(is(typeof(__traits(parameters)) == AliasSeq!(char[])));
}
}
}
class Test
{
static assert(!__traits(compiles, __traits(parameters)));
void handle(int x)
{
static assert(typeof(__traits(parameters)).length == 1);
}
}
int add(int x, int y)
{
return x + y;
}
auto forwardToAdd(int x, int y)
{
return add(__traits(parameters));
}
static assert(forwardToAdd(2, 3) == 5);
struct TestConstructor
{
int x;
string y;
//This parameter will not have a name but it's (tuple) members
//will
this(typeof(this.tupleof))
{
this.tupleof = __traits(parameters);
}
}
bool test(int x, string y)
{
auto s = TestConstructor(2, "pi");
return s.x == x && s.y == y;
}
static assert(test(2, "pi"));
int testNested(int x)
{
static assert(typeof(__traits(parameters)).length == 1);
int add(int x, int y)
{
static assert(typeof(__traits(parameters)).length == 2);
return x + y;
}
return add(x + 2, x + 3);
}
void testPack(Pack...)(Pack x)
{
static assert(is(typeof(__traits(parameters)) == typeof(AliasSeq!(x))));
}
ref int forwardTest(return ref int x)
{
static assert(__traits(isRef, x) == __traits(isRef, __traits(parameters)[0]));
return x;
}
int testRefness(int x, ref int monkey)
{
{
//monkey = x;
__traits(parameters)[1] = __traits(parameters)[0];
}
return x;
}
int refTest()
{
int x;
testRefness(45, x);
return x;
}
auto packLength(Pack...)(Pack x)
{
return typeof(__traits(parameters)).length;
}
static assert(packLength(2, 3) == 2);
alias lambda = (x) => typeof(__traits(parameters)).stringof;
static assert(lambda(1) == "(int)");
static assert(refTest() == 45);
T testTemplate(T)(scope T input)
{
void chimpInASuit(float set)
{
static assert(is(typeof(__traits(parameters)) == AliasSeq!(float)));
}
{
__traits(parameters) = AliasSeq!(T.max);
}
__traits(parameters) = AliasSeq!(T.init);
return input;
}
static assert(testTemplate!long(420) == 0);
void qualifiers(immutable int a, const bool b)
{
static assert(is(typeof(__traits(parameters)) == AliasSeq!(immutable int, const bool)));
}
int makeAggregate(int a, bool b)
{
struct S
{
typeof(__traits(parameters)) members;
}
S s = S(__traits(parameters));
assert(s.members[0] == a);
assert(s.members[1] == b);
return 1;
}
static assert(makeAggregate(5, true));
int makeAlias(int a, bool b)
{
alias Params = __traits(parameters);
assert(Params[0] == 3);
assert(Params[1] == true);
return 1;
}
static assert(makeAlias(3, true));
mixin template nestedCheckParameters(int unique)
{
alias NestedNames = __traits(parameters);
version (Fixed)
alias Types = typeof(Names);
}
mixin template checkParameters(int unique)
{
mixin nestedCheckParameters!unique;
alias Names = __traits(parameters);
alias Types = typeof(Names);
}
int makeAggregateMixin(immutable int a, const bool b)
{
mixin checkParameters!0;
struct S
{
mixin checkParameters!1;
typeof(Names) members;
}
S s = S(Names);
assert(s.members[0] == a);
assert(s.members[1] == b);
return 1;
}