Files
swift-mirror/test/Constraints/parameterized_existentials.swift
Alastair Houghton c889c794e4 [Sema] Fix diagnostic generation for missing protocol conformance.
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
2026-06-30 15:37:43 +01:00

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'}}
}