mirror of
https://github.com/dlang/dmd.git
synced 2025-04-26 13:10:12 +03:00
216 lines
4.9 KiB
D
216 lines
4.9 KiB
D
// EXTRA_FILES: imports/testlambda1.d imports/testlambda2.d
|
|
module testlambdacomp;
|
|
|
|
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);
|
|
}
|
|
|
|
int bar()
|
|
{
|
|
return 2;
|
|
}
|
|
|
|
void testImportedFunctions(alias pred)()
|
|
{
|
|
// imports.testalambda1.bar != imports.testlambda2.bar
|
|
import imports.testlambda2 : bar;
|
|
static assert(!__traits(isSame, pred, (int a) => a + bar()));
|
|
}
|
|
|
|
void testLocalGlobalFunctionScopes(alias pred)()
|
|
{
|
|
// testlambdacomp.bar != testlambdacomp.test5.bar
|
|
static assert(!__traits(isSame, pred, (int a) => a + bar()));
|
|
|
|
// imports.testlambda1.bar != testlambdacomp.test5.bar
|
|
import imports.testlambda1 : bar;
|
|
static assert(!__traits(isSame, pred, (int a) => a + bar()));
|
|
|
|
// functions imported from different modules are not equal
|
|
testImportedFunctions!((int a) => a + bar())();
|
|
}
|
|
|
|
// lambda functions which contain function calls
|
|
void test5()
|
|
{
|
|
|
|
int bar()
|
|
{
|
|
return 3;
|
|
}
|
|
|
|
// functions in the same scope
|
|
alias pred = a => a + bar();
|
|
alias pred2 = b => b + bar();
|
|
static assert(__traits(isSame, pred, pred2));
|
|
|
|
// functions in different scopes
|
|
testLocalGlobalFunctionScopes!((int a) => a + bar())();
|
|
|
|
int foo(int a, int b)
|
|
{
|
|
return 2 + a + b;
|
|
}
|
|
|
|
// functions with different kind of parameters
|
|
alias preda23 = a => a + foo(2, 3);
|
|
alias predb23 = b => b + foo(2, 3);
|
|
alias predc24 = c => c + foo(2, 4);
|
|
alias predd23 = (int d) => d + foo(2, 3);
|
|
alias prede23 = (int e) => e + foo(2, 3);
|
|
alias predf24 = (int f) => f + foo(2, 4);
|
|
static assert(__traits(isSame, preda23, predb23));
|
|
static assert(!__traits(isSame, predc24, predd23));
|
|
static assert(__traits(isSame, predd23, prede23));
|
|
static assert(!__traits(isSame, prede23, predf24));
|
|
|
|
// functions with function calls as parameters
|
|
static assert(!__traits(isSame, (int a, int b) => foo(foo(1, a), foo(1, b)), (int a, int b) => foo(foo(1, a), foo(2, b))));
|
|
static assert(!__traits(isSame, (a, b) => foo(foo(1, a), foo(1, b)), (int a, int b) => foo(foo(1, a), foo(2, b))));
|
|
|
|
float floatFunc(float a, float b)
|
|
{
|
|
return a + b;
|
|
}
|
|
|
|
static assert(__traits(isSame, a => floatFunc(a, 1.0), b => floatFunc(b, 1.0)));
|
|
static assert(!__traits(isSame, a => floatFunc(a, 1.0), b => floatFunc(b, 2.0)));
|
|
}
|
|
|
|
void main()
|
|
{
|
|
test1();
|
|
test2();
|
|
test3();
|
|
test4();
|
|
test5();
|
|
}
|