Return value storage classes - `scope` as well as `ref`
Nick Treleaven
nick at geany.org
Mon May 29 10:08:38 UTC 2023
Recently we've discussed syntax solutions to `ref` not applying
to a variable/parameter when those are of function pointer type:
https://issues.dlang.org/show_bug.cgi?id=2753
`ref` is a function attribute, so this problem is easier to
solve. Also it is not allowed after the parameter list because
conceptually it applies to the return value.
However, there is another case of missing syntax for an
unimplemented feature. `scope` would be useful to apply to the
return value of a function. Currently `scope` is disallowed on
functions except for methods or delegates, where it applies to
`this` or the context. There are cases where it would be useful
to apply to the return value - e.g. for `List.front` here:
https://issues.dlang.org/show_bug.cgi?id=17934
```d
Elem elem;
{
auto l = list();
elem = l.front; // should error
// destructor called
}
```
And for `S.fp` here:
https://forum.dlang.org/post/mqyqlieghqwsinbqiqbp@forum.dlang.org
```d
int* p;
{
auto lf = S(5);
p = lf.fp; // should error
// destructor called
}
```
Syntax solutions proposed to fix the `ref` problem are:
* Parenthesized type syntax -
https://forum.dlang.org/post/fnfuczxfyjpyespactjt@forum.dlang.org
* leading function pointer type syntax -
https://forum.dlang.org/post/qngjoxgihmcsvoprnanb@forum.dlang.org
* trailing return type syntax -
https://forum.dlang.org/post/iveapbodjzgqfjkujsop@forum.dlang.org
The first two have PRs. I think only the latter fixes the `scope`
problem. A simpler fix would be this ordering:
```
Type ReturnStorage? Identifier Parameters
```
Where *ReturnStorage* is `ref` or `scope`.
```d
T scope ref func_name();
```
Using parentheses just for the storage class(es) would work too:
```d
(scope ref) T func_name();
```
Also, solving the problem generally could be useful in the future
if we want any other storage classes to apply to the return value
rather than the function or the parameter.
More information about the Digitalmars-d
mailing list