mirror of
https://github.com/dlang/dmd.git
synced 2025-04-27 13:40:11 +03:00
97 lines
2.1 KiB
D
97 lines
2.1 KiB
D
// https://issues.dlang.org/show_bug.cgi?id=20470
|
|
|
|
alias AliasSeq(Args...) = Args;
|
|
|
|
int g, h;
|
|
|
|
void test0()
|
|
{
|
|
static struct S
|
|
{
|
|
int a, b;
|
|
float c = 0, d = 0;
|
|
alias fields = AliasSeq!(a, b, c, d);
|
|
alias ints = AliasSeq!(a, b);
|
|
alias floats = AliasSeq!(c, d);
|
|
alias reversed = AliasSeq!(d, c, b, a);
|
|
alias globals = AliasSeq!(g, h);
|
|
|
|
alias properties = AliasSeq!(e, f);
|
|
@property int e() { return a; }
|
|
@property void e(int i) { a = i; }
|
|
@property float f() { return c; }
|
|
@property void f(float j) { c = j; }
|
|
}
|
|
|
|
S s;
|
|
assert(s.fields == AliasSeq!(0, 0, 0, 0));
|
|
s.ints = AliasSeq!(1, 2);
|
|
assert(s.fields == AliasSeq!(1, 2, 0, 0));
|
|
s.floats = AliasSeq!(3, 4);
|
|
assert(s.fields == AliasSeq!(1, 2, 3, 4));
|
|
|
|
int a, b;
|
|
float c, d;
|
|
AliasSeq!(d, c, b, a) = s.reversed;
|
|
assert(AliasSeq!(a, b, c, d) == AliasSeq!(1, 2, 3, 4));
|
|
|
|
s.globals = AliasSeq!(30, 40);
|
|
assert(g == 30 && h == 40);
|
|
|
|
// Propagating `this` to functions and properties within tuples will be a breaking change.
|
|
// See `test2()` below for an example of existing code that would need to be fixed.
|
|
|
|
//s.properties = AliasSeq!(11, 12);
|
|
//assert(s.e == 11 && s.f == 12);
|
|
}
|
|
|
|
class Nested(Vars...)
|
|
{
|
|
int a, b;
|
|
alias outervars = Vars;
|
|
alias fields = AliasSeq!(a, b);
|
|
alias all = AliasSeq!(a, b, Vars);
|
|
}
|
|
|
|
auto makeNested()
|
|
{
|
|
static class C
|
|
{
|
|
bool b;
|
|
double d;
|
|
auto nested() { return new Nested!(b, d)(); }
|
|
}
|
|
return new C().nested();
|
|
}
|
|
|
|
void test1()
|
|
{
|
|
auto n = makeNested();
|
|
n.fields = AliasSeq!(1, 2);
|
|
n.outervars = AliasSeq!(true, 1.3);
|
|
assert(n.all == AliasSeq!(1, 2, true, 1.3));
|
|
}
|
|
|
|
void test2()
|
|
{
|
|
// backwards compatibility test for functions within tuples
|
|
|
|
static struct S
|
|
{
|
|
void f();
|
|
void g();
|
|
alias funcs = AliasSeq!(f, g);
|
|
}
|
|
|
|
S s;
|
|
alias voidTf = void();
|
|
foreach (f; s.funcs)
|
|
static assert(is(typeof(f) == voidTf));
|
|
}
|
|
|
|
void main()
|
|
{
|
|
test0();
|
|
test1();
|
|
test2();
|
|
}
|