Understanding DIP 1000 semantics -- Where's the bug?

Meta jared771 at gmail.com
Mon Sep 23 19:10:25 UTC 2019

On Monday, 23 September 2019 at 18:46:40 UTC, Meta wrote:
> AFAICT, according to dip1000 this code should not allow the 
> result of `foo(x)` to be assigned to p, as it has a longer 
> lifetime. Likewise, it should not allow foo to return &x 
> without the parameter being annotated with `return`. This looks 
> like a bug in the implementation.

Specifically, this breaks rule 1 from DIP1000:

A scope variable can only be initialized and assigned from values 
that have lifetimes longer than the variable's lifetime. (As a 
consequence a scope variable can only be assigned to scope 
variables that have shorter lifetime.)

This rule is broken by `p = foo(x)`, since p has a longer 
lifetime than x. Marking the `ref int x` parameter of foo 
`scope`, `return scope` or `scope return` did not help, but 
marking it as `return` *did* cause the compiler to correctly 
reject this code. Also changing foo to:

int* foo(ref int x)
     return &x;


int* foo(int* x)
     return x;
p = foo(&x);

Causes the compiler to correctly reject this code, so the problem 
seems to specifically be with returning the address of a ref 
parameter stored in a local variable.

More information about the Digitalmars-d mailing list