swift
2734f3ca - stdlib: Add SIMDMaskScalar.SIMDMaskScalar == SIMDMaskScalar requirement to SIMDScalar

Commit
3 years ago
stdlib: Add SIMDMaskScalar.SIMDMaskScalar == SIMDMaskScalar requirement to SIMDScalar In theory this is a source break if someone had a weird custom conforming type, but I suspect in practice conformances to this protocol are never defined. The reason we want this requirement is that often you will see code like the following: protocol Point { associatedtype Scalar: SIMDScalar associatedtype Vector: SIMD where Vector.Scalar == Scalar } extension Point where Vector == SIMD2<Scalar> { ... } When `Vector` is equated with `SIMD2<Scalar>`, we get an infinite sequence of implied same-type requirements: Vector.MaskStorage == SIMD2<Scalar.MaskScalar> Vector.MaskStorage.MaskStorage == SIMD2<Scalar.MaskScalar.MaskScalar> ... The protocol fails to typecheck with an error because the requirement machine cannot build a rewrite system. If SIMDScalar requires that MaskScalar.MaskScalar == MaskScalar, then we instead get Vector.MaskStorage == SIMD2<Scalar.MaskScalar> Vector.MaskStorage.MaskStorage == SIMD2<Scalar.MaskScalar> Vector.MaskStorage.MaskStorage == Vector.MaskStorage ... Which ties off the recursion. In theory, a more advanced implementation could represent this kind of infinite recursion in 'closed form', but we don't have that yet, and I believe adding this same-type requirement makes sense anyway. Fixes rdar://problem/95075552.
Author
Committer
Parents
Loading