mirror of
https://github.com/apple/swift.git
synced 2026-10-06 12:37:28 +02:00
If we try to return a parameterized existential and the type returned does not conform to the protocol for that existential, the constraint system can get itself into an invalid state, leading to a "failure to produce a diagnostic" message. As a fix, skip requirements that have error types after substitution. rdar://178854703
66 lines
2.1 KiB
Swift
66 lines
2.1 KiB
Swift
// RUN: %target-typecheck-verify-swift -target %target-swift-5.7-abi-triple
|
|
|
|
protocol P<A> {
|
|
associatedtype A
|
|
|
|
func f() -> A
|
|
}
|
|
|
|
func f1(x: any P) -> any P<Int> {
|
|
// FIXME: Bad diagnostic
|
|
return x // expected-error {{failed to produce diagnostic for expression}}
|
|
}
|
|
|
|
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()
|
|
}
|
|
|
|
protocol P2<T> {
|
|
associatedtype T
|
|
}
|
|
|
|
final class P2Class<T> {}
|
|
|
|
func makeP2<T>() -> any P2<T> {
|
|
P2Class<T>() // expected-error {{return expression of type 'P2Class<T>' does not conform to 'P2'}}
|
|
}
|