On 5/24/22 10:06 PM, frame wrote:

Sorry, this was not affront, it was meant as my POV that you may have problems to get my problem because I have (as usually) forgot to make this more visible that some code was truncated.

OK, sorry to read into that ;)

I tried your suggestion, as replied to Adam - the symbol is unique and it shows that correct location. It's not different from the error message.

Just to be pedantic, you tried that call in the *exact place* the assert is failing to compile? D can be weird/surprising about name lookups.


However, this error has nothing to do with `assert()`. In fact the compiler allows nothing than invocation or this error will be triggered. Even that fails:

The compiler is treating `fun` not as a function pointer, but as a function. However, the type looks correct to me. I tried a simple example on run.dlang.io, even with multiple modules, and seems to work as expected.


```d
// same error:
auto test = cast(void*)fun;
```


try:

pragma(msg, typeof(fun));

If I do:

```d
extern(C) void foo(string) {}

pragma(msg, typeof(foo));
pragma(msg, typeof(&foo));
```

I get:

extern (C) void(string param)
extern (C) void function(string param)

The first is a function (yes, they have a type), and the latter is a function pointer.

So that might give a clue whether the compiler thinks `fun` is a function or a function pointer. D should *never* call a function pointer without parentheses.

If you get the latter, yet your assert fails, then that is most certainly a compiler bug. Again, important that you do this in the exact place the assert fails to ensure the same name lookup situation.

-Steve

Reply via email to