| // RUN: %target-typecheck-verify-swift |
| |
| class C { |
| func f() {} |
| } |
| |
| class D : C { |
| } |
| |
| class E { } |
| |
| protocol P { |
| associatedtype Assoc : C // expected-note{{unable to infer associated type 'Assoc' for protocol 'P'}} |
| func getAssoc() -> Assoc |
| } |
| |
| struct X1 : P { |
| func getAssoc() -> D { return D() } |
| } |
| |
| struct X2 : P { // expected-error{{type 'X2' does not conform to protocol 'P'}} |
| func getAssoc() -> E { return E() } // expected-note{{inferred type 'E' (by matching requirement 'getAssoc()') is invalid: does not inherit from 'C'}} |
| } |
| |
| func testP<T:P>(_ t: T) { |
| _ = t.getAssoc() as C |
| t.getAssoc().f() |
| } |
| |
| func callTestP(_ x1: X1) { |
| testP(x1) |
| } |