On Tuesday, 22 September 2020 at 18:21:10 UTC, Jacob Carlborg wrote:
On 2020-09-19 21:50, Per Nordlöw wrote:
On Saturday, 19 September 2020 at 18:48:31 UTC, Jacob Carlborg wrote:
A nested class seems to be able to escape the `this` reference:

Ahh, thanks.

I just realized that it can escape into other parameters without the `scope` qualifier?

This

class Bar
{
     void bar(scope Bar b) @safe pure
     {
         b = this;
     }
}

compiles but this

class Bar
{
     scope void bar(scope Bar b) @safe pure
     {
        b = this; // Error: scope variable `this` assigned to `b` with longer lifetime
     }
}

Hmm, why would `b` have longer lifetime? Isn't the lifetime of `b` throughout `bar`?

The following analysis might be wrong but I think that `scope` as a **member** function attribute is not supposed to be used as that is not even documented.

So it would works "by default". The compiler thinks that `this` is a scope variable that will stop living after `bar()`.

Also as `b` is not `ref` this is clearly a wrong diagnostic. There's a special case missing in the compiler.

Reply via email to