Introspecting a range for .front `scope`ness
Dukc
ajieskola at gmail.com
Wed May 24 21:13:09 UTC 2023
I'm trying to improve `std.array : array` to infer whether it's
parameter range can be `scope`. To do this, I need to introspect
whether the `.front` of the range in question is `scope`. I also
need to differentiate plain `scope` front from `scope return` or
`return scope`. That is, I need to distinguish the first of these
from the latter two:
```D
struct Range
{ // Can point to stack, won't return self-references.
ElType front() scope;
// Can point to stack, might return a self-reference or
reference to pointed-to data.
ElType front() scope return;
// Can point to stack. If so, may return a pointer to stack,
but not to this struct itself.
ElType front() return scope;
}
```
I tried to solve it this way:
```D
static if(is(typeof((scope Range test, ElementType!Range[] out_)
=> out_[0] = test.front)))
```
However, this passes even if `range.front` is `return scope`
(which I want to fail this test). I suspect it's because scope
checks are only done in `@safe` code. I can't test the assignment
for safety since Phobos has to work with ranges that have
`@system` `.front` or `.front.opAssign`.
I figured out I need to introspect the parameter storage class of
`test.front`, but how? `std.traits : ParameterStorageClassTuple`
would work, but it doesn't tell the storage classes of the hidden
`.this` pointer - only those of the visible parameters.
More information about the Digitalmars-d-learn
mailing list