| 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(); |
| } |
| } |