// 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!();