// RUN: %target-typecheck-verify-swift protocol P1 { func foo() -> Int } protocol P2 : P1 { func foo() -> Int } func f (_ elements: C) { var _: Int = elements.foo() // should not error } protocol _Collection { associatedtype Index associatedtype _Element subscript(i: Index) -> _Element {get} } protocol Collection : _Collection, Sequence { subscript(i: Index) -> Iterator.Element {get} } protocol MutableCollection : Collection { subscript(i: Index) -> Iterator.Element {get set} } func insertionSort< C: MutableCollection >( _ elements: inout C, i: C.Index ) { var _: C.Iterator.Element = elements[i] // should not error } // rdar://problem/21322215 protocol FactoryProtocol { associatedtype Item } protocol MyCollection : Swift.Collection {} struct TestClass< Factory : FactoryProtocol, NodeCollection : MyCollection > where NodeCollection.Iterator.Element == Factory.Item { var flattenedNodes: NodeCollection func test() { let node1 = self.flattenedNodes[self.flattenedNodes.startIndex] let typecheck1: NodeCollection.Iterator.Element = node1 _ = typecheck1 } }