[Issue 21868] DIP1000 doesn't catch pointer to struct temporary

d-bugmail at puremagic.com d-bugmail at puremagic.com
Thu Jun 3 18:46:15 UTC 2021


Dennis <dkorpel at live.nl> changed:

           What    |Removed                     |Added
                 CC|                            |dkorpel at live.nl

--- Comment #1 from Dennis <dkorpel at live.nl> ---
Here's it reduced some more:

struct S {
    int buf;
    int* ptr; // <= required

int* getPtr(ref return scope S this_) {
    return &this_.buf;

Since getPtr does not return by `ref`, the `return scope` applies to the
members of `S` and not the `ref this_` itself.
The compiler checks whether `&this_.buf;` is escaped by value.
In `visit(AddrExp e)` of escape.d, it reduces this to checking whether
`this_.x` escapes by ref, which reduces to checking whether `this_` escapes by
Then it looks at the parameter's storage classes, and sees `return`, so it
allows it.
This is wrong, the `return` does not apply to `&this_.x`, only to `this_.buf`;

Without the `buf` member, S has no pointers, so the `return scope` attribute is
meaningless, so it is stripped away at some earlier stage.
This way the compiler can't mistake it for a `ref return`, so it raises an

I'm still trying to grasp the incredibly difficult logic in escape.d so I'm not
sure how to fix this yet.


More information about the Digitalmars-d-bugs mailing list