d: Merge upstream dmd, druntime 26f049fb26, phobos 330d6a4fd.
[official-gcc.git] / gcc / testsuite / gdc.test / compilable / test23174.d
blob9047fd7f8a95d78929a631132a0d45645e6b8bb4
1 // https://issues.dlang.org/show_bug.cgi?id=23174
3 alias AliasSeq(T...) = T;
5 template staticMap(alias fun, args...)
7 alias staticMap = AliasSeq!();
8 static foreach(arg; args)
9 staticMap = AliasSeq!(staticMap, fun!arg);
12 template Filter(alias pred, args...)
14 alias Filter = AliasSeq!();
15 static foreach (arg; args)
16 static if (pred!arg)
17 Filter = AliasSeq!(Filter, arg);
20 struct Fields(T)
22 private static alias toField(alias e) = Field!(__traits(identifier, e));
23 alias fields = staticMap!(toField, T.tupleof);
25 static alias map(alias F) = staticMap!(F, fields);
26 static alias filter(alias pred) = Filter!(pred, fields);
29 struct Field(string n)
31 enum name = n;
34 struct Foo
36 int a;
39 void test23174()
41 Foo value;
43 enum toName(alias e) = e.name;
44 enum pred(alias e) = true;
46 alias a = Fields!(Foo).filter!(pred); // works
47 static assert(is(a == AliasSeq!(Field!"a")));
49 alias b = Fields!(Foo).map!(toName); // works
50 static assert(b == AliasSeq!("a"));
52 alias c = Fields!(Foo).init.filter!(pred); // works
53 static assert(is(c == AliasSeq!(Field!"a")));
55 // OK <- Error: alias `d` cannot alias an expression `Fields().tuple("a")`
56 alias d = Fields!(Foo).init.map!(toName);
57 static assert(d == AliasSeq!("a"));