On Thursday, 2 March 2023 at 15:56:35 UTC, ryuukk_ wrote:
```D
@safe ref int wrongIdentity(ref int x) {
return x; // ERROR! Cannot return a ref, please use "return ref"
}
@safe ref int identity(return ref int x) {
    return x; // fine
}
```
a keyword to return a value

``return 5;``

and a keyword to tell that a reference is returnable

``return ref int x``

that's dumb, why?

Late answer, but it happens because DIP25 is now the default. `ref` without `return` means that the return value cannot refer to the parameter in question. You can alternatively fix this by turning function attribute inference on, by omitting `int` from the function header.

Why DIP25 is needed? Consider this:

```D
int* pointer1;
int* pointer2;

@safe ref int incrementAndCopy(ref int x)
{   return *new int(x++);
}

@safe unittest
{   int local = 0;

    pointer1 = &local.identity;
    pointer2 = &incrementAndCopy(local);
}
```

The compiler must prevent the first assignment to `pointer`, because otherwise it would end up pointing to an expired stack variable. On the other hand, we don't want to disallow harmless usage of `ref` like that of the `incrementAndCopy` call in the second assignment. To achieve that, the compiler needs to distinguish between `ref` variables that may be referenced to by the return value, and those that cannot. Plain `ref` means it can not, `return ref` means it can.

Reply via email to