On 19.11.22 15:07, Nick Treleaven wrote:
Hi,
The following seems like a bug to me (reduced code, FILE* changed to int*):
```d
@safe:

struct LockedFile
{
     private int* fps;

     auto fp() return scope => fps;
}

void main()
{
     int* p;
     {
         auto lf = LockedFile(new int);
         p = lf.fp;
     }
     assert(p != null); // address escaped
}
```
There's no error with -dip1000.
I'll file this unless I overlooked something.

Let me rewrite `fp` as a static method. It's easier (for me) to understand what's going on that way:

----
static int* fp(return scope ref LockedFile that)
{
    return that.fps;
}
----

That's essentially just a function that returns its pointer parameter. So the program boils down to this:

----
@safe:
int* fp(return scope int* p) { return p; }
void main()
{
    int* p;
    {
        auto lf = new int;
        p = fp(lf);
    }
    assert(p != null); // address escaped
}
----

Which is fine, as far as I can tell. `lf` is not `scope`. And when you pass it through `fp`, the result is still not `scope`. So escaping it is allowed.

You do get an error when you make `lf` `scope` (explicitly or implicitly). So everything seems to be in order.

Reply via email to