On Tuesday, 25 June 2019 at 11:16:47 UTC, Jonathan M Davis wrote:
On Tuesday, June 25, 2019 1:32:58 AM MDT Eugene Wissner via Digitalmars-d- learn wrote:
struct Container
{
}

static struct Inserter
{
     private Container* container;

private this(return scope ref Container container) @trusted
     {
         this.container = &container;
     }

}

auto func()()
{
     Container container;
     return Inserter(container);
}

void main()
{
     static assert(!is(typeof(func!())));
}

The code above compiles with dmd 2.085, but not 2.086 (with
-preview=dip1000). What am I doing wrong?

You're storing a pointer to a scope variable. That's violating the entire point of scope. If something is scope, you can't store any kind of reference to it. And since container is a local variable in func, and Inserter tries to return from func with a pointer to container, you definitely have an @safety problem, because that pointer would be invalid once func returned.

- Jonathan M Davis

So you're saying that func() shouldn't compile? And it is exactly what the assertion in the main function does: it asserts that the function cannot be instantiated. And it was true for 2.085 but it can be instantiated with 2.086.

Reply via email to