-dip1000 and non-scope variables
snarwin at gmail.com
Thu Feb 18 15:22:06 UTC 2021
On Thursday, 18 February 2021 at 14:33:19 UTC, Dukc wrote:
> On Thursday, 18 February 2021 at 10:05:52 UTC, RazvanN wrote::
>> class MinPointerRecorder
>> int* minPrice;
>> void update(ref int price) @safe
>> minPrice = &price; /* Should not compile. */
>> Does anyone know what exactly is the intended behavior?
>> Unfortunately both the spec and the DIP  do not explicitly
>> mention this cases.
> That member function itself can compile, no problem. But
> -dip1000 should prevent calling it with a local argument:
This was my understanding as well, based on paragraph 4 of the
spec's section on "Return Ref Parameters" :
> If the function returns void, and the first parameter is ref or
> out, then all subsequent return ref parameters are considered
> as being assigned to the first parameter for lifetime checking.
> The this reference parameter to a struct non-static member
> function is considered the first parameter.
(I assume "struct" here is supposed to be "struct or class".)
But if you try it with a struct instead of a class, the compiler
*does* flag the assignment as invalid, even with an explicit
void update(return ref int price) @safe
minPrice = &price;
// Error: address of variable `price` assigned to `this`
with longer lifetime
On the other hand, if you change the `ref` to a `scope` pointer,
it compiles again:
void update(return scope int* price) @safe
minPrice = price; // Ok
So, I'm not sure what the correct answer here is.
More information about the Digitalmars-d