Skip to content

[SR-12980] Making protocol inherit CaseIterable produces nonsensical errors #55426

@jepers

Description

@jepers
Previous ID SR-12980
Radar rdar://problem/88514540
Original Reporter @jepers
Type Bug
Status Resolved
Resolution Done
Additional Detail from JIRA
Votes 1
Component/s
Labels Bug
Assignee None
Priority Medium

md5: ffff7ab8fd7dbc98f69de8dba225a412

Issue Description:

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
  Self.Element: Vector,
  Self.Index == Self.Element.Index,
  Self.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 Self.Index == Self.Element.Index is now being ignored.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugA deviation from expected or documented behavior. Also: expected but undesirable behavior.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions