Files
swift-mirror/test/Constraints/parameterized_existentials.swift
Slava Pestov 8beaa7b231 Sema: Fix matchExistentialType() handling of ProtocolCompositionType containing ParameterizedProtocolType
This fixes a soundness hole. We can't just match up the primary
associated types of different protocols.
2024-10-22 20:14:44 -04:00

55 lines
1.9 KiB
Swift

// 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()
}