mirror of
https://github.com/dlang/dmd.git
synced 2025-04-26 13:10:12 +03:00
122 lines
2.1 KiB
D
122 lines
2.1 KiB
D
struct A
|
|
{
|
|
ulong i;
|
|
void foo(ulong a)
|
|
{
|
|
i = a;
|
|
}
|
|
|
|
void foo(string s)
|
|
{
|
|
i = s.length;
|
|
}
|
|
|
|
void bar(T)(T a)
|
|
{
|
|
i = a;
|
|
}
|
|
|
|
void bar(T : string)(T s)
|
|
{
|
|
i = s.length;
|
|
}
|
|
}
|
|
|
|
alias ai = A.i;
|
|
alias afoo = A.foo;
|
|
alias abar = A.bar;
|
|
alias abar_ulong = A.bar!ulong;
|
|
alias abar_string = A.bar!string;
|
|
|
|
struct B
|
|
{
|
|
A a;
|
|
}
|
|
|
|
alias ba = B.a;
|
|
|
|
template T(alias x)
|
|
{
|
|
void set(int n)
|
|
{
|
|
x = n;
|
|
}
|
|
}
|
|
|
|
mixin template M(alias x)
|
|
{
|
|
void set(int n)
|
|
{
|
|
x = n;
|
|
}
|
|
}
|
|
|
|
struct C
|
|
{
|
|
int i;
|
|
alias t = T!i;
|
|
mixin M!i m;
|
|
}
|
|
|
|
alias ct = C.t;
|
|
alias ctset = C.t.set;
|
|
alias cm = C.m;
|
|
alias cmset = C.m.set;
|
|
|
|
|
|
// adapted from https://thecybershadow.net/d/dconf2017/#/21
|
|
struct S { string a, b, c; }
|
|
|
|
static string printField(alias field)()
|
|
{
|
|
S s = { a: "aa", b: "bb", c: "cc" };
|
|
return __traits(child, s, field);
|
|
}
|
|
|
|
void main()
|
|
{
|
|
auto f = printField!(S.b)();
|
|
assert(f == "bb");
|
|
|
|
A a;
|
|
__traits(child, a, ai) = 3;
|
|
assert(a.i == 3);
|
|
assert(__traits(child, a, ai) == 3);
|
|
__traits(child, a, afoo)(2);
|
|
assert(a.i == 2);
|
|
__traits(child, a, afoo)("hello");
|
|
assert(a.i == 5);
|
|
__traits(child, a, abar)(6);
|
|
assert(a.i == 6);
|
|
__traits(child, a, abar_ulong)(7);
|
|
assert(a.i == 7);
|
|
__traits(child, a, abar_string)("hi");
|
|
assert(a.i == 2);
|
|
|
|
__traits(child, a, A.i) = 7;
|
|
assert(a.i == 7);
|
|
__traits(child, a, A.bar)(3);
|
|
assert(a.i == 3);
|
|
__traits(child, a, A.bar!ulong)(4);
|
|
assert(a.i == 4);
|
|
__traits(child, a, __traits(getMember, A, "i")) = 5;
|
|
assert(a.i == 5);
|
|
__traits(child, a, __traits(getOverloads, A, "bar", true)[1])("hi!");
|
|
assert(a.i == 3);
|
|
|
|
B b;
|
|
__traits(child, b.a, ai) = 2;
|
|
assert(b.a.i == 2);
|
|
__traits(child, __traits(child, b, ba), ai) = 3;
|
|
assert(b.a.i == 3);
|
|
|
|
C c;
|
|
__traits(child, c, ct).set(3);
|
|
assert(c.i == 3);
|
|
__traits(child, c, ctset)(4);
|
|
assert(c.i == 4);
|
|
__traits(child, c, cm).set(5);
|
|
assert(c.i == 5);
|
|
__traits(child, c, cmset)(6);
|
|
assert(c.i == 6);
|
|
}
|