///Hello, i'm trying to implement d compiler and i've problems
with some template corner cases.
class Type{}
class Foo(T : const T){
alias X = T;
}
alias Bar(T : Foo!Ts, Ts...) = Ts[0];
pragma(msg, "Foo1: ", Foo!(immutable Type).X); //Foo1: Type
pragma(msg, "Foo2: ", Foo!(Type).X); //Foo2: Type
pragma(msg, "Bar: ", Bar!(Foo!(Type))); //Bar:
immutable(Type)
Last pragma attempted to extract template parameters from
'Foo!(Type)' but since Foo!(immutable Type) == Foo!(Type) and
Foo!(immutable Type) was instantiated first, it extracted wrong
type.
If we change order of 1. and 2. pragma, result of 3. pragma will
be Type and not immutable(Type).
Is this a bug?