blob: 945dffb6b2f39e64fb7de15f4b25d43339d5d062 [file] [log] [blame]
// 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!();