Found by Rene Zwanenburg: http://forum.dlang.org/post/xzfnqpkjsxyrebdhzsrz@forum.dlang.org Reduced test case: ---- static assert(is(typeof(TypeInfo.init) == TypeInfo)); /* fails; should pass */ ---- Rene's test case: ---- void main() { import std.algorithm.mutation : remove; TypeInfo_Class[] arr; TypeInfo_Class c; arr = arr.remove!(a => a is c); } ---- The problem is that TypeInfo defines an "init" method which shadows the built-in init property. This confuses templates when they expect T.init to be the init value of T. In Rene's code, ElementType is the one trying to use the init property. In my opinion, the compiler should reject members called "init". A quick test shows that it already rejects "sizeof" and "mangleof".
Pull request to start fixing this by renaming the method to "initializer": https://github.com/D-Programming-Language/druntime/pull/1403
*** This issue has been marked as a duplicate of issue 12233 ***