Bug 3326 – $ cannot be used in delegate literals

Status
RESOLVED
Resolution
FIXED
Severity
minor
Priority
P4
Component
dmd
Product
D
Version
D2
Platform
Other
OS
All
Creation time
2009-09-17T07:46:16Z
Last change time
2022-12-19T15:02:39Z
Keywords
rejects-valid
Assigned to
No Owner
Creator
Kasumi Hanazuki

Comments

Comment #0 by k.hanazuki — 2009-09-17T07:46:16Z
Windows DMD 2.032 Evaluating $ in a delegate literal in an array indexing or slicing throws access violation Error. ---- void main() { int[] a = [1]; auto x = a[{ auto n = $; return 0; }()]; // object.Error: Access Violation auto y = a[{ auto n = $; return 0; }() .. $]; // object.Error: Access Violation }
Comment #1 by clugdbug — 2010-07-23T00:05:49Z
This worked in 2.000 and all versions of D1, Failed with access violation in 2.012. Bumping up to regression.
Comment #2 by clugdbug — 2010-08-06T00:11:01Z
This isn't a regression, it never worked properly (on D1, it doesn't segfault, but the generated code is wrong). It's happening because __dollar isn't a real variable in the parent scope. I think to fix this properly, either the implementation of __dollar would need to change, OR the delegate literal would need to be inlined; but this case is so obscure, it doesn't matter much. To turn this from wrong-code into a rather obscure rejects-valid: declaration.c, VarDeclaration::checkNestedReference(), line 1441 (D2 svn 599): fdv->closureVars.push(this); L2: ; + // __dollar creates problems because it isn't a real variable + if (ident == Id::dollar) + ::error(loc, "cannnot use $ inside a function literal (Bugzilla 3326)");
Comment #3 by bugzilla — 2010-08-08T22:30:46Z
Comment #4 by yebblies — 2011-07-01T22:11:16Z
Reopening as this hasn't been fixed, just turned into a rejects-valid
Comment #5 by razvan.nitu1305 — 2022-09-08T07:31:43Z
The code compiles and runs successfully today.
Comment #6 by razvan.nitu1305 — 2022-09-08T07:37:01Z
Actually, I wrongfully compiled. This is still reproducible.
Comment #7 by razvan.nitu1305 — 2022-12-19T15:02:39Z
This has been fixed. At most this could be seen as an enhancement. However, the use case is really narrow.