CaseIterable makes compiler miss constraint

This program compiles as expected:

protocol VectorIndex {}

protocol Vector {
  associatedtype Element
  associatedtype Index: VectorIndex
  subscript(index: Index) -> Element { get set }
  init(_ indexToElementMapping: (Index) -> Element)
}

// Some methods for square matrices:
extension Vector where
  Element: Vector,
  Index == Element.Index,
  Element.Element: BinaryFloatingPoint
{
  func row(_ index: Index) -> Element { self[index] }

  func column(_ index: Index) -> Element { Element { self[$0][index] } }
}

But note that if we make VectorIndex inherit/refine CaseIterable, like so:

protocol VectorIndex: CaseIterable {}

the program will no longer compile, because:

error: cannot convert value of type 'Self.Element.Index' (associated type of protocol 'Vector') to expected argument type 'Self.Index' (associated type of protocol 'Vector')

ie, it seems like the constraint Index == Element.Index is now being ignored.


I reported this as SR-12980

1 Like
Terms of Service

Privacy Policy

Cookie Policy