-dip1000 and non-scope variables

Paul Backus 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. */
>>     }
>> }
>> [snip]
>> Does anyone know what exactly is the intended behavior? 
>> Unfortunately both the spec and the DIP [2] 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" [1]:

> 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 
`return` annotation:

struct MinPointerRecorder
{
     int* minPrice;
     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:

struct MinPointerRecorder
{
     int* minPrice;
     void update(return scope int* price) @safe
     {
         minPrice = price; // Ok
     }
}

So, I'm not sure what the correct answer here is.

[1] https://dlang.org/spec/function.html#return-ref-parameters


More information about the Digitalmars-d mailing list