1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
// RUN: %target-typecheck-verify-swift -disable-availability-checking
protocol P<A> {
associatedtype A
func f() -> A
}
func f1(x: any P) -> any P<Int> {
// FIXME: Bad diagnostic
return x // expected-error {{type of expression is ambiguous without a type annotation}}
}
func f2(x: any P<Int>) -> any P {
return x // okay
}
func f3(x: any P<Int>) -> any P<String> {
// FIXME: Misleading diagnostic
return x // expected-error {{cannot convert return expression of type 'Int' to return type 'String'}}
}
struct G<T> {}
// expected-note@-1 {{arguments to generic parameter 'T' ('any P<Int>' and 'any P') are expected to be equal}}
// expected-note@-2 {{arguments to generic parameter 'T' ('any P' and 'any P<Int>') are expected to be equal}}
// expected-note@-3 {{arguments to generic parameter 'T' ('any P<Int>' and 'any P<String>') are expected to be equal}}
func g1(x: G<any P>) -> G<any P<Int>> {
return x // expected-error {{cannot convert return expression of type 'G<any P>' to return type 'G<any P<Int>>'}}
}
func g2(x: G<any P<Int>>) -> G<any P> {
return x // expected-error {{cannot convert return expression of type 'G<any P<Int>>' to return type 'G<any P>'}}
}
func g3(x: G<any P<Int>>) -> G<any P<String>> {
return x // expected-error {{cannot convert return expression of type 'G<any P<Int>>' to return type 'G<any P<String>>'}}
}
func h1(x: (any P)?) -> (any P<Int>)? {
return x // expected-error {{cannot convert return expression of type '(any P)?' to return type '(any P<Int>)?'}}
// expected-note@-1 {{arguments to generic parameter 'Wrapped' ('any P' and 'any P<Int>') are expected to be equal}}
}
func h2(x: (any P<Int>)?) -> (any P)? {
return x // okay
}
func h3(x: (any P<Int>)?) -> (any P<String>)? {
return x // expected-error {{cannot convert return expression of type '(any P<Int>)?' to return type '(any P<String>)?'}}
}
func generic1<T>(x: any P<T>) -> T {
return x.f()
}
|