Bug 23981 – enum siblings and struct member naming conflict undetected and counter intuitive path prefered

Status
NEW
Severity
enhancement
Priority
P1
Component
dlang.org
Product
D
Version
D2
Platform
All
OS
All
Creation time
2023-06-09T17:45:54Z
Last change time
2024-12-15T15:27:49Z
Assigned to
No Owner
Creator
crazymonkyyy
Moved to GitHub: dlang.org#3998 →

Comments

Comment #0 by crazymonkyyy — 2023-06-09T17:45:54Z
```d import std; struct button_{ int j; bool opCast(T:bool)(){ "casted".writeln; return up;//down; } bool down(){ assert(j==0,"called down on something not shift "~j.to!string); return true; } bool up(){ assert(0,"I thought I was calling down"); } } enum button{ shift=button_(0),down=button_(1) } unittest{ if(button.shift.down){ "shift was pressed".writeln; } } enum abc{a,b,c} unittest{ abc foo; foo=foo.a.b.c.c.b.a;//????????? } ``` I expect the enum button to contain a reference of shift that I can then ask if its down Instead, the shift has a sibling called down and that is the interpretation the compiler prefers; this needs a warning or an error
Comment #1 by dkorpel — 2023-06-09T19:45:28Z
I reduced the example a bit: ```D struct B { int j; bool down() {return true;} } enum button { shift = B(0), down = B(1), // without this line, it compiles } void main() { // Error: struct `B` does not overload () if (button.shift.down()) {} } ``` This is indeed very confusing, and a result of D allowing you to access static properties of a type using an instance of that type. I don't know if the specification says one of them is supposed to have priority.
Comment #2 by robert.schadek — 2024-12-15T15:27:49Z
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/dlang.org/issues/3998 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB