dlang.org
dlang.org copied to clipboard
enum siblings and struct member naming conflict undetected and counter intuitive path prefered
crazymonkyyy reported this on 2023-06-09T17:45:54Z
Transferred from https://issues.dlang.org/show_bug.cgi?id=23981
CC List
- Dennis
Description
```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
dkorpel commented on 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.