#dbugfix Issue 16486 200$

Timon Gehr timon.gehr at gmx.ch
Sat Mar 31 17:21:23 UTC 2018


On 31.03.2018 18:34, Simen Kjærås wrote:
> On Saturday, 31 March 2018 at 13:34:18 UTC, Kagamin wrote:
>> On Friday, 30 March 2018 at 13:56:45 UTC, Stefan Koch wrote:
>>> Ah that is an interesting bug which further demonstrates that 
>>> templates are a tricky thing :)
>>> Basically you cannot _generally_ proof that one template just 
>>> forwards to another.
>>> Therefore you have to create separate types.
>>> And since you create separate types the alias is not an alias but a 
>>> separate template.
>>> Solving this may be possible for special cases but in the general 
>>> case is infeasible.
>>
>> If a template is used as a type it should be resolved to a type, no? 
>> And template resolves to a type in a straightforward way. Where does 
>> it fail? Judging by the error message "cannot deduce function from 
>> argument types !()(TestType!int)" it does successfully resolve alias 
>> to a type.
> 
> You're starting in the wrong end - the type cannot yet be considered, 
> since the compiler doesn't know the correct arguments to TestAlias. 
> Given this code:
> 
> struct S(T...) {}
> alias SS(T...) = S!(T, int);
> 
> void foo(T)(SS!T arg) {}
> 
> unittest {
>      foo(SS!string());
> }
> 
> The error message is "template foo cannot deduce function from argument 
> types !()(S!(string, int)), candidates are: foo(T)(SS!T arg)".
> ...
> 
> If the compiler were to do something other than give up, we would need 
> some algorithm to define what it should try, and in which order.

It should simply run a limited semantic analysis on the function 
parameters before matching.

void foo(T)(SS!T arg) -> void foo(T)(S!(T, int) arg)

To support Ilya's use case, it suffices to expand unconstrained alias 
templates.


More information about the Digitalmars-d mailing list