I have this code:
==========
class S
{
    int i = -1;

    this(int n) { i = n; writeln(i," ",__PRETTY_FUNCTION__); }
    ~this() { writeln(i," ",__PRETTY_FUNCTION__); }
}


auto create()
{
    writeln("-> ",__PRETTY_FUNCTION__);
    scope(exit) writeln("<- ",__PRETTY_FUNCTION__);

    return scoped!S(1);
}

auto do_something(S s)
{
    writeln("-> ",s.i," ",__PRETTY_FUNCTION__);
    scope(exit) writeln("<- ",s.i," ",__PRETTY_FUNCTION__);

    return s;
}

auto do_lazy(lazy S s)
{
    writeln("-> ",__PRETTY_FUNCTION__);
    scope(exit) writeln("<- ",__PRETTY_FUNCTION__);

    return s;
}

void main()
{
    writeln("-> ",__PRETTY_FUNCTION__);
    scope(exit) writeln("<- ",__PRETTY_FUNCTION__);

    create()
    .do_lazy()
    .do_something();
}
==========
This is the output:
==========
-> void test.main()
-> test.do_lazy(lazy S s)
-> test.create()
1 S test.S.this(int n)
<- test.create()
1 void test.S.~this()                (1)
<- test.do_lazy(lazy S s)
-> 1703096 test.do_something(S s)    (2)
<- 1703104 test.do_something(S s)    (3)
<- void test.main()
==========

Why is dtor called before returning from do_lazy function - see (1)? It seems cause uninitialized parameter in do_something call after it in (2)-(3).

Reply via email to