// RUN: %target-typecheck-verify-swift -swift-version 4 // RUN: %target-swift-frontend -typecheck %s -debug-generic-signatures 2>&1 | %FileCheck %s protocol P0 { } protocol Q0: P0 { } protocol P1 { associatedtype AssocP1: Q0 func getAssocP1() -> AssocP1 } protocol P2 : P1 { associatedtype AssocP2: P1 func getAssocP2() -> AssocP2 } protocol P3 { associatedtype AssocP3: P0 func getAssocP3() -> AssocP3 } protocol P4: P3 { } protocol P5 : P4 { associatedtype AssocP5 where AssocP3: Q0 } func acceptP0(_: T) { } func acceptQ0(_: T) { } func acceptP1(_: T) { } func acceptP2(_: T) { } func acceptP3(_: T) { } func testPaths1(_ t: T) { acceptP0(t.getAssocP2().getAssocP1()) acceptP0(t.getAssocP3()) } func testPaths2(_ t: U) where U.AssocP3 == U.AssocP2.AssocP1 { acceptP0(t.getAssocP2().getAssocP1()) } func testPaths3(_ v: V) { acceptP0(v.getAssocP3()) acceptQ0(v.getAssocP3()) } // CHECK-LABEL: .P6Unordered@ // CHECK-NEXT: Requirement signature: protocol P6Unordered: P5Unordered { associatedtype A: P0 // expected-warning{{redeclaration of associated type 'A'}} } protocol P5Unordered { associatedtype A: P0 // expected-note{{'A' declared here}} func getA() -> A } func testUnorderedP5_P6(_ w: W) { acceptP0(w.getA()) }