[Issue 19752] New: dip1000 isn't @safe if struct contains a slice

d-bugmail at puremagic.com d-bugmail at puremagic.com
Tue Mar 19 11:26:45 UTC 2019


https://issues.dlang.org/show_bug.cgi?id=19752

          Issue ID: 19752
           Summary: dip1000 isn't @safe if struct contains a slice
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Linux
            Status: NEW
          Severity: critical
          Priority: P1
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: atila.neves at gmail.com

The code below compiles as expected with dip100. It's @safe because `range`'s
return value has the lifetime extended from the `this` parameter:

--------------------------------
struct Container {

    auto range() @safe return scope {
        static struct Range {
            Container *self;
        }

        return Range(&this);
    }
}

--------------------------------

Trying to escape the result of `range` then fails to compile, as expected.
However, adding a slice member variable to the struct above causes this:

----------------------------------
struct Container {
    // as before
    int[] ints;
----------------------------------

$ dmd -preview=dip1000 bug2.d
bug2.d(10): Error: cannot take address of scope parameter this in @safe
function range


>From the original DIP, it's to be expected that `ints` would have the same
lifetime as `this` and things should work. This is particularly bad because if
the programmer attempts a workaround the code below compiles and shouldn't:

https://github.com/atilaneves/automem/issues/26

--


More information about the Digitalmars-d-bugs mailing list