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