mirror of
https://github.com/dlang/dmd.git
synced 2025-04-26 13:10:12 +03:00
155 lines
2.1 KiB
D
155 lines
2.1 KiB
D
// 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!();
|