Mixin template parameter overloading bug?
Andrey Zherikov
andrey.zherikov at gmail.com
Sat Jun 14 02:16:58 UTC 2025
On Saturday, 14 June 2025 at 02:10:03 UTC, monkyyy wrote:
> On Saturday, 14 June 2025 at 01:46:31 UTC, Andrey Zherikov
> wrote:
>> On Saturday, 14 June 2025 at 00:02:32 UTC, Andrey Zherikov
>> wrote:
>> Simplified test case a bit more.
>> This works:
>> ```d
>> template f(void function(int) F) {}
>> template f(int function(int) F) {}
>>
>> mixin f!((int _) {});
>> mixin f!((int _) => 0);
>>
>> mixin f!((int) {});
>> mixin f!((int) => 0);
>>
>> mixin f!((_) {});
>> mixin f!((_) => 0); // Error: cannot return non-void from
>> `void` function
>> ```
>>
>> Can anyone explain why adding type of the parameter in lambda
>> (`int`) makes this working?
>
> https://dlang.org/spec/template-mixin.html
>
> Your still mixing syntax; mixin templates are suppose to be a
> separate system according to the spec.
>
> ```d
> import std;
> void f(int function(int) F)(){"int".writeln;}
> void f(void function(int) F)(){"void".writeln;}
> unittest{
> f!((_) {});
> f!((_) => 0);
> }
>
> mixin template g(int function(int) F){string s1="int";}
> mixin template g(void function(int) F){string s2="void";}
> unittest{
> mixin g!((_) {});
> mixin g!((_) => 0);
> s1.writeln;
> s2.writeln;
> }
> ```
Modified your example a bit.
This works:
```d
mixin template f(void function(int) F) { void s1()
{"void".writeln; } }
mixin template f(int function(int) F) { void s2() {"int".writeln;
} }
void main()
{
mixin f!((_) {});
mixin f!((_) => 0);
s1();
s2();
}
```
This does not:
```d
mixin template f(void function(int) F) { void s1()
{"void".writeln; } }
mixin template f(int function(int) F) { void s2() {"int".writeln;
} }
mixin f!((_) {});
mixin f!((_) => 0); // Error: cannot return non-void from `void`
function
void main()
{
s1();
s2();
}
```
More information about the Digitalmars-d-learn
mailing list