On Tuesday, 9 September 2025 at 20:56:19 UTC, Steven
Schveighoffer wrote:
On Tuesday, 9 September 2025 at 20:08:06 UTC, monkyyy wrote:
On Tuesday, 9 September 2025 at 19:17:11 UTC, Steven
Schveighoffer wrote:
In short `opDispatch` only is valid if it compiles. If it
doesn't compile, it's as if it doesn't exist.
Yours still thinking declaratively, that cant be true. The
best description of its behavior is that it discards errors.
```d
import std;
enum counter=cast(immutable(void)*)[0].ptr;
auto getcount()=>(*(cast(int*)counter));
auto count()=>(*(cast(int*)counter))++;
struct foo{
void opDispatch(string s)(){
enum _=count();
static assert(0);
}
}
void bar(foo){}
void foobar(foo){}
unittest{
foo().bar;
foo().foobar;
getcount.writeln;//2
}
```
This calls the UFCS versions, because the `opDispatch` version
does not compile.
The other thing is just a bug.
-Steve
```d
import std;
struct foo{
void opDispatch(string s)(){
pragma(msg,"hi");
static assert(0);
}
}
void bar(foo){}
unittest{
foo().bar;//prints hi
}
```
Even if you were egregious bigoted to some features out of some
kind of spec purity belief; its demonstrable with entirely in
spec behavior