module imports.link15194std; // std.algorithm.setopts /* setUnion template function is instantiated in module link15194 as root, * and linked into executable. * * - In "original case", due to link to typeid(const RBRange!(RBNode!int*)), * unSpeculative should be called for the type of typeid operand. * * - In "additional case", typeid(const RBRange!(RBNode!int*)*) returns * TypeInfo_Pointer instance. But later its 'next' field access will reference * RBRange instance. Therefore typeid should also unSpeculative the bottom struct * of operand type. */ version (A) { // additional case TypeInfo setUnion(Rs...)(Rs ) { return typeid(const Rs[0]*).next; // semanticTypeInfo should also unSpaculate TypePointer.next. } } else { // original case struct SetUnion(Rs...) { Rs r; // Rs[0] == RBRange!(RBNode!int*) // Rs[1] == int[] // size_t toHash() is implicitly generated by buildXtoHash. // And from that, // typeid(const RBRange!(RBNode!int*)) // and // typeid(const int[]) // are referenced to invoke TypeInfo.getHash(). } SetUnion!(Rs) setUnion(Rs...)(Rs ) { return typeof(return)(); } } // std.container.rbtree struct RBNode(V) {} struct RBRange(N) {} class RedBlackTree(Elem) { alias Range = RBRange!(RBNode!Elem*); Range opSlice() { return Range(); } }