[Issue 19183] DIP1000 defeated if auto used instead of scope in variable declaration with template this member function

d-bugmail at puremagic.com d-bugmail at puremagic.com
Tue Aug 21 21:30:06 UTC 2018


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

--- Comment #8 from Atila Neves <atila.neves at gmail.com> ---
> @safe code can mess with it

No it can't, that's the point of @safe. Mess with it how?

> Why shouldn't this compile? There's no `scope` anywhere now (except maybe an inferred one)

Function template => inferred attributes => scope. But fine, this compiles and
shouldn't:

----------
@safe:

const(int)* gInts;

void main() {
    auto s = MyStruct();
    gInts = s.ptr;
}

struct MyStruct {
    int* ints;
    scope ptr(this This)() { return ints; }
}
----------

> This makes sense to me. With `s` being `scope`, the compiler now checks it and its contents don't leave `main`.


Because, from DIP1000:

A variable is inferred to be scope if it is initialized with a value that has a
non-∞ lifetime.


This very same code without a template this and instead manual instantiations
of the three versions (mutable, const, immutable) doesn't compile _even_ if
`auto` is used in the variable declaration.

Furthermore, if `auto` was enough to get away from compiler checks, DIP1000
would be useless since nobody is going to remember to write `scope`.

--


More information about the Digitalmars-d-bugs mailing list