mirror of
https://github.com/dlang/dmd.git
synced 2025-04-27 13:40:11 +03:00
141 lines
2.7 KiB
D
141 lines
2.7 KiB
D
|
|
void test1()
|
|
{
|
|
static assert(__traits(isSame, (a, b) => a + b, (c, d) => c + d));
|
|
static assert(__traits(isSame, a => ++a, b => ++b));
|
|
static assert(!__traits(isSame, (int a, int b) => a + b, (a, b) => a + b));
|
|
static assert(__traits(isSame, (a, b) => a + b + 10, (c, d) => c + d + 10));
|
|
}
|
|
|
|
class Y
|
|
{
|
|
static int r = 5;
|
|
int x;
|
|
this(int x)
|
|
{
|
|
this.x = x;
|
|
}
|
|
}
|
|
|
|
class A
|
|
{
|
|
Y a;
|
|
this(Y a)
|
|
{
|
|
this.a = a;
|
|
}
|
|
}
|
|
|
|
void foo3(alias pred)()
|
|
{
|
|
static assert(!__traits(isSame, pred, (A x, A y) => ++x.a.x + (--y.a.x)));
|
|
}
|
|
|
|
void test2()
|
|
{
|
|
|
|
int b;
|
|
static assert(!__traits(isSame, a => a + b, a => a + b));
|
|
|
|
int f() { return 3;}
|
|
static assert(!__traits(isSame, a => a + f(), a => a + f()));
|
|
|
|
class A
|
|
{
|
|
Y a;
|
|
this(Y a)
|
|
{
|
|
this.a = a;
|
|
}
|
|
}
|
|
|
|
class B
|
|
{
|
|
int a;
|
|
this(int a)
|
|
{
|
|
this.a = a;
|
|
}
|
|
}
|
|
|
|
B q = new B(7);
|
|
alias pred = (A a, A b) => ++a.a.x + (--b.a.x);
|
|
foo3!pred();
|
|
static assert(!__traits(isSame, (A a) => ++a.a.x + 2, (A b) => ++b.a.x + 3));
|
|
static assert(__traits(isSame, pred, (A x, A y) => ++x.a.x + (--y.a.x)));
|
|
static assert(!__traits(isSame, (B a) => ++a.a + 2, (B b) => ++b.a + 3));
|
|
static assert(__traits(isSame, (B a) => ++a.a, (B a) => ++a.a));
|
|
|
|
B cl = new B(7);
|
|
static assert(!__traits(isSame, a => a + q.a, c => c + cl.a));
|
|
|
|
class C(G)
|
|
{
|
|
G a;
|
|
this(int a)
|
|
{
|
|
this.a = a;
|
|
}
|
|
}
|
|
static assert(!__traits(isSame, (C!int a) => ++a.a, (C!int a) => ++a.a));
|
|
|
|
struct X
|
|
{
|
|
int a;
|
|
}
|
|
static assert(__traits(isSame, (X a) => a.a + 2, (X b) => b.a + 2));
|
|
|
|
struct T(G)
|
|
{
|
|
G a;
|
|
}
|
|
static assert(!__traits(isSame, (T!int a) => ++a.a, (T!int a) => ++a.a));
|
|
|
|
}
|
|
|
|
void test3()
|
|
{
|
|
enum q = 10;
|
|
static assert(__traits(isSame, (a, b) => a + b + q, (c, d) => c + d + 10));
|
|
|
|
struct Bar
|
|
{
|
|
int a;
|
|
}
|
|
enum r1 = Bar(1);
|
|
enum r2 = Bar(1);
|
|
static assert(__traits(isSame, a => a + r1.a, b => b + r2.a));
|
|
|
|
enum X { A, B, C}
|
|
static assert(__traits(isSame, a => a + X.A, a => a + 0));
|
|
}
|
|
|
|
void foo(alias pred)()
|
|
{
|
|
static assert(__traits(isSame, pred, (c, d) => c + d));
|
|
static assert(__traits(isSame, (c, d) => c + d, pred));
|
|
}
|
|
|
|
void bar(alias pred)()
|
|
{
|
|
static assert(__traits(isSame, pred, (c, d) => c < d + 7));
|
|
|
|
enum q = 7;
|
|
static assert(__traits(isSame, pred, (c, d) => c < d + q));
|
|
|
|
int r = 7;
|
|
static assert(!__traits(isSame, pred, (c, d) => c < d + r));
|
|
}
|
|
void test4()
|
|
{
|
|
foo!((a, b) => a + b)();
|
|
bar!((a, b) => a < b + 7);
|
|
}
|
|
|
|
void main()
|
|
{
|
|
test1();
|
|
test2();
|
|
test3();
|
|
test4();
|
|
}
|