Bug 13216 – Failed anti-hijacking of with statement
Status
RESOLVED
Resolution
INVALID
Severity
normal
Priority
P1
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2014-07-27T14:55:49Z
Last change time
2020-11-09T01:38:04Z
Keywords
accepts-invalid, diagnostic
Assigned to
No Owner
Creator
bearophile_hugs
Comments
Comment #0 by bearophile_hugs — 2014-07-27T14:55:49Z
This compiles with no errors with dmd 2.066beta5. This seems a bug, a failure of the anti-hijacking mechanism of with():
struct S { int k = 1; }
struct T { int k = 2; }
void main() {
S s;
T t;
with (t) {
assert(k == 2);
with(s) {
assert(k == 1);
}
}
}
Adapted from code by monarch_dodra:
http://forum.dlang.org/thread/[email protected]
Comment #1 by pro.mathias.lang — 2020-11-09T01:38:04Z
This works as intended. I think you are confusing two notions: hijacking and shadowing. We prevent hijacking by making sure a change in a different module will not suddenly change the symbol being called, but keep the same behavior or result in an error. There's no hijacking protection within a module itself.
However we have shadowing protection. We make sure not to allow a more nested scope to override a scope name from an outer scope, as long as this outer scope is in the same function.
However, `with`'s whole point is to bypass this. An object used in a `with` clause will be searched first for this scope. Erroring on shadowing would render the feature completely useless and unreliable.