dlang.org icon indicating copy to clipboard operation
dlang.org copied to clipboard

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

Open dlangBugzillaToGithub opened this issue 2 years ago • 1 comments

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

dlangBugzillaToGithub avatar Jun 09 '23 17:06 dlangBugzillaToGithub

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.

dlangBugzillaToGithub avatar Jun 09 '23 19:06 dlangBugzillaToGithub