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