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