Bug 23565 – Change `$` semantics so that it works with `.ptr` too
Status
RESOLVED
Resolution
WONTFIX
Severity
enhancement
Priority
P4
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2022-12-17T02:53:57Z
Last change time
2022-12-20T21:46:24Z
Keywords
pull
Assigned to
No Owner
Creator
Basile-z
Comments
Comment #0 by b2.temp — 2022-12-17T02:53:57Z
We can use `.ptr` in slice and indexes expressions to bypass bounds verification but then we lose the opportunity to use `$` for the subscripts, even if an array and hence a `.length` is possible.
I propose to enhance the semantics of `$` so that this code compiles and execute
```d
void main()
{
auto b = new int[](2);
b.ptr[0 .. $] = [1,2]; // b.ptr[0 .. b.length] = [1,2];
assert(b == [1,2]);
b.ptr[$-1] = 3;
assert(b == [1,3]);
}
```
This would break nothing as this is currently rejected, e.g for the example with
> Error: undefined identifier `$`
Comment #1 by dlang-bot — 2022-12-19T03:08:11Z
@SixthDot created dlang/dmd pull request #14716 "fix issue 23565 - Allow the use of `$` as index on `.ptr` expressions" fixing this issue:
- fix issue 23565 - Allow the use of `$` as index on `.ptr` expressions
We can use `.ptr` in slice and indexes expressions to bypass bounds verification
but then we loose the opportunity to use `$` in the expression that give the subscripts,
even if an array and hence a `.length` is possible.
This commit fix the problem as long as the `.ptr` LHS is a (optionally dotted) variable
The implementation is based on a front-end lowering as the existing
system was not designed for this case (it finalize the substitution in
the mid-end function `resolveLengthVar()`)
https://github.com/dlang/dmd/pull/14716