1 // https://issues.dlang.org/show_bug.cgi?id=16574
2 template Recursive(T) if (is(T == class))
3 {
4     // fails because T is still forward referenced
5     // speculative determineSize must not set type to error
6     static assert (!__traits(compiles, { new T; }));
7     // known size of class
8     static assert (is(typeof(T.init) == T));
9 
10     alias Recursive = T;
11 }
12 
13 // must be resolvable
14 class C
15 {
16     Recursive!C r;
17 }
18 
19 template Recursive(T) if (is(T == struct))
20 {
21     // fails because T is still forward referenced
22     // speculative determineSize must not set type to error
23     static assert (!__traits(compiles, { T t; }));
24     // no size yet for struct
25     static assert (!is(typeof(T.init)));
26 
27     alias Recursive = T*;
28 }
29 
30 // must be resolvable
31 struct S
32 {
33     Recursive!S r;
34 }
35