| // https://issues.dlang.org/show_bug.cgi?id=22292 |
| |
| // Original case |
| |
| class C1 |
| { |
| C1 c1; |
| this () pure |
| { |
| c1 = this; |
| } |
| } |
| immutable x = cast(immutable)r; |
| |
| auto r() |
| { |
| C1 c1 = new C1; |
| return c1; |
| } |
| |
| // Reference stored in another class |
| |
| template Test2() |
| { |
| class C1 |
| { |
| C2 c2; |
| this () pure |
| { |
| C1 a = this; |
| c2 = new C2(a); |
| } |
| } |
| class C2 |
| { |
| C1 c1; |
| this (C1 c) pure |
| { |
| c1 = c; |
| } |
| } |
| immutable x = cast(immutable)r; |
| |
| auto r() |
| { |
| C1 c1 = new C1(); |
| return c1; |
| } |
| } |
| |
| alias test2 = Test2!(); |
| |
| // Ditto but using a struct in the middle |
| |
| template Test3() |
| { |
| class C0 |
| { |
| S1 s1; |
| |
| this() |
| { |
| s1 = S1(this); |
| } |
| } |
| struct S1 |
| { |
| C1 c1; |
| this (C0 c) |
| { |
| c1 = new C1(c); |
| } |
| } |
| class C1 |
| { |
| C0 c0; |
| this(C0 c) |
| { |
| c0 = c; |
| } |
| } |
| immutable x = cast(immutable)r; |
| |
| auto r() |
| { |
| C0 c0 = new C0(); |
| return c0; |
| } |
| } |
| |
| alias test3 = Test3!(); |
| |
| // From https://issues.dlang.org/show_bug.cgi?id=22114 |
| |
| template Test4() |
| { |
| public class Test1(T) |
| { |
| private Test2!T val; |
| |
| this() |
| { |
| val = new Test2!T(this); |
| } |
| |
| private class Test2(T) |
| { |
| private Test1!(T) m_source; |
| |
| this(Test1!T source) |
| { |
| m_source = source; |
| } |
| } |
| } |
| |
| public class Demo |
| { |
| auto val = new Test1!int(); |
| } |
| } |
| |
| alias test4 = Test4!(); |
| |
| // ditto |
| |
| template Test5() |
| { |
| public @nogc class TestA(T) |
| { |
| private TestB!T valA; |
| private TestB!T valB; |
| this() |
| { |
| valB = valA = new TestB!T(this); |
| } |
| |
| private @nogc class TestB(T) |
| { |
| private TestA!(T) m_source; |
| |
| this(TestA!T source) |
| { |
| m_source = source; |
| } |
| } |
| } |
| |
| public class Demo |
| { |
| auto val = new TestA!int(); |
| } |
| } |
| |
| alias test5 = Test5!(); |