Mixin template parameter overloading bug?
monkyyy
crazymonkyyy at gmail.com
Sat Jun 14 03:17:09 UTC 2025
On Saturday, 14 June 2025 at 02:16:58 UTC, Andrey Zherikov wrote:
> 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();
> }
> ```
```d
import std;
mixin template f(int function(int) F){}
mixin template f(void function(int) F){unittest{"void".writeln;}}
//mixin f!((_){}); //FAILS
mixin template g(void function(int) F){unittest{"void".writeln;}}
mixin template g(int function(int) F){}
mixin g!((_){}); //works
```
this example makes it purely a compiler bug
I cant escape any useful information(I tried `typeof(return)`),
seems to be limited to just void return functions
More information about the Digitalmars-d-learn
mailing list