Mixin template parameter overloading bug?

monkyyy crazymonkyyy at gmail.com
Sat Jun 14 00:26:27 UTC 2025


On Saturday, 14 June 2025 at 00:02:32 UTC, Andrey Zherikov wrote:
> The simplest code that shows the issue:
> ```d
> struct S{}
>
> template f(void function(S) F) {}
> template f(int function(S) F) {}
>
> mixin f!((_) {});
> mixin f!((_) => 0);  // Error: cannot return non-void from 
> `void` function
>                      // mixin f!((_) => 0);
>                      //                 ^
>                      //        while looking for match for 
> `f!((_) => 0)`
>                      // mixin f!((_) => 0);
> ```
>
> If I swap `template f` declarations:
> ```d
> struct S{}
>
> template f(int function(S) F) {}
> template f(void function(S) F) {}
>
> mixin f!((_) {}); // Error: function 
> `onlineapp.__lambda_L8_C10(__T1)(_)` has no `return` statement, 
> but is expected to return a value of type `int`
>                   // mixin f!((_) {});
>                   //          ^
>                   //         while looking for match for `f!((_)
>                   // {
>                   // }
>                   // )`
>                   // mixin f!((_) {});
>                   // ^
> mixin f!((_) => 0);
> ```
>
> But if I remove `S` from template parameters, everything works:
> ```d
> template f(int function() F) {}
> template f(void function() F) {}
>
> mixin f!(() {});
> mixin f!(() => 0);
> ```
>
> Is this a bug somewhere in compiler or in my code?

I believe every change in compilation from (top level) 
declaration order is considered a compiler bug

However, I see.... Allot of issues with this code, Id want to see 
something near functional code around this subject; its worth 
poking, but its possible every possible way to make this code 
work would eliminate the pattern here

for example this compiles:
```d
import std;
struct S{}
template f(void function(S) F) {alias f=void;}
template f(int function(S) F) {alias f=int;}

unittest{
	alias a=f!((_) {});
	alias b=f!((_) => 0);
	a.stringof.writeln;
	b.stringof.writeln;
}
```

mixin templates vs declaration templates was a bad decision in my 
opinion but thats old news.


More information about the Digitalmars-d-learn mailing list