// RUN: %target-swift-frontend %s -emit-silgen > /dev/null public protocol MyIteratorProtocol { associatedtype Element mutating func next() -> Element? } // UnsafeBufferPointer public struct UBP {} public protocol MySequence { associatedtype Element associatedtype Iterator: MyIteratorProtocol where Iterator.Element == Element __consuming func makeIterator() -> Iterator func _customContainsEquatableElement( _ element: Element ) -> Bool? func withContiguousStorageIfAvailable( _ body: (_ buffer: UBP) throws -> R ) rethrows -> R? } extension MySequence where Self.Iterator == Self { public __consuming func makeIterator() -> Iterator { return self } } extension MySequence { public func _customContainsEquatableElement( _ element: Iterator.Element ) -> Bool? { return nil } public func withContiguousStorageIfAvailable( _ body: (UBP) throws -> R ) rethrows -> R? { return nil } } public struct MyIndexingIterator { } extension MyIndexingIterator: MyIteratorProtocol, MySequence { public typealias Element = Elements.Element public typealias Iterator = MyIndexingIterator public typealias SubSequence = MySequence public mutating func next() -> Elements.Element? { return nil } } public struct MyDefaultIndices {} extension MyDefaultIndices: MyCollection { public typealias Index = Elements.Index public typealias Element = Elements.Index public typealias Indices = MyDefaultIndices public typealias SubSequence = MyDefaultIndices public typealias Iterator = MyIndexingIterator> public __consuming func makeIterator() -> Iterator { fatalError("todo") } } public struct MySlice { } extension MySlice: MyCollection { public typealias Index = Base.Index public typealias Indices = Base.Indices public typealias Element = Base.Element public typealias SubSequence = MySlice public typealias Iterator = MyIndexingIterator> public __consuming func makeIterator() -> Iterator { fatalError("todo") } } public protocol MyCollection: MySequence { override associatedtype Element associatedtype Index /* : Comparable */ associatedtype Iterator = MyIndexingIterator associatedtype SubSequence: MyCollection = MySlice where SubSequence.Index == Index, Element == SubSequence.Element, SubSequence.SubSequence == SubSequence associatedtype Indices: MyCollection = MyDefaultIndices where Indices.Element == Index, Indices.Index == Index, Indices.SubSequence == Indices } public struct MyRange {} extension MyRange: MySequence { public typealias Element = Bound public typealias Iterator = MyIndexingIterator> public __consuming func makeIterator() -> Iterator { fatalError("todo") } } extension MyRange: MyCollection { public typealias Index = Bound public typealias Indices = MyRange public typealias SubSequence = MyRange } public struct KVPair: MyCollection { public typealias Element = (key: Key, value: Value) public typealias Index = Int public typealias Indices = MyRange public typealias SubSequence = MySlice public typealias Iterator = MyIndexingIterator public __consuming func makeIterator() -> Iterator { fatalError("todo") } }