Looking at the requirement signatures in 5.6 vs main:
Requirement signature: <Self where Self : Collection, Self.C : Collection, Self.Element == Self.C.Element, Self.Index == Self.C.Index>
Requirement signature: <Self where Self.C : CoordinateSystem, Self.X : NonEmptyProtocol, Self.C.B == Self.C.B.C.B.C.B, Self.X.C : NonEmptyProtocol, Self.C.B.C.B.C.B == Self.C.P.C.B.C.B, Self.C.P.C.B.C.B == Self.C.S.C.B.C.B, Self.C.S.C.B.C.B == Self.C.B.C.P.C.B.C.B, Self.C.B.C.P.C.B.C.B == Self.C.P.C.S.C.B.C.B, Self.C.P.C.S.C.B.C.B == Self.C.S.C.P.C.B.C.B>
Requirement signature: <Self where Self == Self.B.C, Self.B : BoundingBox, Self.L : Line, Self.P : Point, Self.S : Size, Self.B.C == Self.L.C, Self.L.C == Self.P.C, Self.P.C == Self.S.C, Self.L.X.Indices == Self.L.X.Indices.SubSequence, Self.L.X.SubSequence == Self.L.X.SubSequence.SubSequence, Self.L.X.C.Indices == Self.L.X.C.Indices.SubSequence, Self.L.X.C.SubSequence == Self.L.X.C.SubSequence.SubSequence, Self.L.X.Indices.Indices == Self.L.X.Indices.Indices.SubSequence, Self.L.X.SubSequence.Indices == Self.L.X.SubSequence.Indices.SubSequence, Self.L.X.C.C.Indices == Self.L.X.C.C.Indices.SubSequence, Self.L.X.C.C.SubSequence == Self.L.X.C.C.SubSequence.SubSequence, Self.L.X.C.Indices.Indices == Self.L.X.C.Indices.Indices.SubSequence, Self.L.X.C.SubSequence.Indices == Self.L.X.C.SubSequence.Indices.SubSequence, Self.L.X.SubSequence.Indices.Indices == Self.L.X.SubSequence.Indices.Indices.SubSequence, Self.L.X.C.C.Indices.Indices == Self.L.X.C.C.Indices.Indices.SubSequence, Self.L.X.C.C.SubSequence.Indices == Self.L.X.C.C.SubSequence.Indices.SubSequence, Self.L.X.C.SubSequence.Indices.Indices == Self.L.X.C.SubSequence.Indices.Indices.SubSequence, Self.L.X.C.C.SubSequence.Indices.Indices == Self.L.X.C.C.SubSequence.Indices.Indices.SubSequence>
Requirement signature: <Self where Self : MultiPoint>
Requirement signature: <Self where Self == Self.C.S, Self.C : CoordinateSystem, Self.C.L.X.Indices == Self.C.L.X.Indices.SubSequence, Self.C.L.X.SubSequence == Self.C.L.X.SubSequence.SubSequence, Self.C.L.X.C.Indices == Self.C.L.X.C.Indices.SubSequence, Self.C.L.X.C.SubSequence == Self.C.L.X.C.SubSequence.SubSequence, Self.C.L.X.Indices.Indices == Self.C.L.X.Indices.Indices.SubSequence, Self.C.L.X.SubSequence.Indices == Self.C.L.X.SubSequence.Indices.SubSequence, Self.C.L.X.C.C.Indices == Self.C.L.X.C.C.Indices.SubSequence, Self.C.L.X.C.C.SubSequence == Self.C.L.X.C.C.SubSequence.SubSequence, Self.C.L.X.C.Indices.Indices == Self.C.L.X.C.Indices.Indices.SubSequence, Self.C.L.X.C.SubSequence.Indices == Self.C.L.X.C.SubSequence.Indices.SubSequence, Self.C.L.X.SubSequence.Indices.Indices == Self.C.L.X.SubSequence.Indices.Indices.SubSequence, Self.C.L.X.C.C.Indices.Indices == Self.C.L.X.C.C.Indices.Indices.SubSequence, Self.C.L.X.C.C.SubSequence.Indices == Self.C.L.X.C.C.SubSequence.Indices.SubSequence, Self.C.L.X.C.SubSequence.Indices.Indices == Self.C.L.X.C.SubSequence.Indices.Indices.SubSequence, Self.C.L.X.C.C.SubSequence.Indices.Indices == Self.C.L.X.C.C.SubSequence.Indices.Indices.SubSequence>
Requirement signature: <Self where Self.C : CoordinateSystem>
Requirement signature: <Self where Self == Self.C.P, Self.C : CoordinateSystem, Self.C.L.X.Indices == Self.C.L.X.Indices.SubSequence, Self.C.L.X.SubSequence == Self.C.L.X.SubSequence.SubSequence, Self.C.L.X.C.Indices == Self.C.L.X.C.Indices.SubSequence, Self.C.L.X.C.SubSequence == Self.C.L.X.C.SubSequence.SubSequence, Self.C.L.X.Indices.Indices == Self.C.L.X.Indices.Indices.SubSequence, Self.C.L.X.SubSequence.Indices == Self.C.L.X.SubSequence.Indices.SubSequence, Self.C.L.X.C.C.Indices == Self.C.L.X.C.C.Indices.SubSequence, Self.C.L.X.C.C.SubSequence == Self.C.L.X.C.C.SubSequence.SubSequence, Self.C.L.X.C.Indices.Indices == Self.C.L.X.C.Indices.Indices.SubSequence, Self.C.L.X.C.SubSequence.Indices == Self.C.L.X.C.SubSequence.Indices.SubSequence, Self.C.L.X.SubSequence.Indices.Indices == Self.C.L.X.SubSequence.Indices.Indices.SubSequence, Self.C.L.X.C.C.Indices.Indices == Self.C.L.X.C.C.Indices.Indices.SubSequence, Self.C.L.X.C.C.SubSequence.Indices == Self.C.L.X.C.C.SubSequence.Indices.SubSequence, Self.C.L.X.C.SubSequence.Indices.Indices == Self.C.L.X.C.SubSequence.Indices.Indices.SubSequence, Self.C.L.X.C.C.SubSequence.Indices.Indices == Self.C.L.X.C.C.SubSequence.Indices.Indices.SubSequence>
Requirement signature: <Self where Self : Collection, Self.[NonEmptyProtocol]C : Collection, Self.[Sequence]Element == Self.[NonEmptyProtocol]C.[Sequence]Element, Self.[Collection]Index == Self.[NonEmptyProtocol]C.[Collection]Index>
Requirement signature: <Self where Self.[MultiPoint]C : CoordinateSystem, Self.[MultiPoint]X : NonEmptyProtocol, Self.[MultiPoint]C.[CoordinateSystem]P == Self.[MultiPoint]X.[Sequence]Element, Self.[MultiPoint]X.[NonEmptyProtocol]C : NonEmptyProtocol>
Requirement signature: <Self where Self == Self.[CoordinateSystem]B.[BoundingBox]C, Self.[CoordinateSystem]B : BoundingBox, Self.[CoordinateSystem]L : Line, Self.[CoordinateSystem]P : Point, Self.[CoordinateSystem]S : Size, Self.[CoordinateSystem]B.[BoundingBox]C == Self.[CoordinateSystem]L.[MultiPoint]C, Self.[CoordinateSystem]L.[MultiPoint]C == Self.[CoordinateSystem]P.[Point]C, Self.[CoordinateSystem]P.[Point]C == Self.[CoordinateSystem]S.[Size]C>
Requirement signature: <Self where Self : MultiPoint>
Requirement signature: <Self where Self == Self.[Size]C.[CoordinateSystem]S, Self.[Size]C : CoordinateSystem>
Requirement signature: <Self where Self.[BoundingBox]C : CoordinateSystem>
Requirement signature: <Self where Self == Self.[Point]C.[CoordinateSystem]P, Self.[Point]C : CoordinateSystem>
The GenericSignatureBuilder's version of MultiPoint, besides having some redundant requirements, is also missing the requirement 'C.P == X.Element' (in your original source this corresponds to 'Self.CoordinateSystem.Point == Points.Element'). Indeed, the 5.6 compiler cannot derive the equivalence:
func sameType<T>(_: T, _: T) {}
func foo<T : MultiPoint>(_: T) {
sameType(T.C.P.self, T.X.Element.self)
}
reduced.swift:42:3: error: conflicting arguments to generic parameter 'T' ('T.C.P.Type' vs. 'T.X.Element.Type')
sameType(T.C.P.self, T.X.Element.self)
^