1 // https://issues.dlang.org/show_bug.cgi?id=20894
2
MT()3 mixin template MT()
4 {
5 int a;
6 alias b = char;
7 void c() {}
8 }
9
10 struct S
11 {
12 mixin MT mt;
13 }
14
main()15 void main()
16 {
17 auto r = S();
18 enum c = S();
19
20 foo!(S.mt);
21 foo!(r.mt);
22 foo!(c.mt); // OK <- ICE
23
24 foo!(mixin("S.mt"));
25 foo!(mixin("r.mt")); // OK <- ICE
26 foo!(mixin("c.mt")); // OK <- ICE
27
28 // some checks
29 foo!(r.mt, c.mt);
30 foo!(mixin("r.mt"), c.mt);
31 foo!(r.mt, mixin("c.mt"));
32 foo!(S.mt, mixin("c.mt"));
33 }
34
35 alias Tup(T...) = T;
36
foo(A...)37 void foo(A...)()
38 {
39 static if (A.length == 2)
40 {
41 static assert(__traits(isSame, A[0], A[1]));
42 enum members = __traits(allMembers, A[0]);
43 static assert(members == __traits(allMembers, A[1]));
44 static assert(members == Tup!("a", "b", "c"));
45 }
46 }
47