On 2012-05-18 16:12, Steven Schveighoffer wrote: > On Fri, 18 May 2012 06:06:45 -0400, Matthias Walter wrote: >> how do I test two types for equality? Suppose I have A and B aliasing >> some type(s), how do I find out if they are aliases the same thing? >> >> I tried the "is(A == B)" expression, but this does not always work (tell >> me if I shall give an example). > > I would expect this to work. What situation does it not (maybe you > aren't actually testing for equality there). > > It could be a bug...
============= struct MyStruct { } struct Wrapper(Wrap) { Wrap _wrap; this(Wrap wrap) { _wrap = wrap; } } struct AliasStruct { public: alias MyStruct Alias; } int main(char[][] args) { auto w = Wrapper!(AliasStruct)(AliasStruct.init); pragma(msg, is(Wrapper!(AliasStruct).Wrap == AliasStruct) ? "true" : "false"); pragma(msg, is(typeof(w._wrap) == AliasStruct) ? "true" : "false"); pragma(msg, is(typeof(w._wrap).Alias == AliasStruct.Alias) ? "true" : "false"); return 0; } ============= prints out false true false during compilation using current git version of dmd. In my application I used the third case, i.e., wanted to find out whether they alias the same thing. >> On the other hand, according to the spec the IsExpression is not >> supposed to compare two aliases with each other. > > where does it say that? Okay, this seems to be my fault. It states different cases for the RHS operator of "is(LHS == RHS)", e.g., "Type == TypeSpecialization", but nothing like "Type == Type". But TypeSpecialization includes Type as well... Best regards, Matthias