Files
swift-mirror/test/decl/protocol/req/unsatisfiable.swift
Slava Pestov 40641f5e91 Sema: Fix dodgy logic in findMissingGenericRequirementForSolutionFix()
'type' and 'missingType' are contextual types in the generic environment
of the witness thunk. We cannot simply map them into the environment of
the conformance, because if the conforming type is a class, the witness
thunk has an extra generic parameter at depth=0, index=0 and all other
generic parameters are shifted down by one depth.
2024-09-13 08:12:51 -04:00

100 lines
3.1 KiB
Swift

// RUN: %target-typecheck-verify-swift -swift-version 4
protocol P {
associatedtype A
associatedtype B
func f<T: P>(_: T) where T.A == Self.A, T.A == Self.B // expected-error{{instance method requirement 'f' cannot add constraint 'Self.A == Self.B' on 'Self'}}
// expected-note@-1 {{protocol requires function 'f' with type '<T> (T) -> ()'}}
}
extension P {
func f<T: P>(_: T) where T.A == Self.A, T.A == Self.B { }
// expected-note@-1 {{candidate would match if 'X.A' (aka 'X') was the same type as 'X.B' (aka 'Int')}}
}
struct X : P {
// expected-error@-1 {{type 'X' does not conform to protocol 'P'}}
// expected-note@-2 {{add stubs for conformance}}
typealias A = X
typealias B = Int
}
protocol P2 {
associatedtype A
func f<T: P2>(_: T) where T.A == Self.A, T.A: P2 // expected-error{{instance method requirement 'f' cannot add constraint 'Self.A: P2' on 'Self'}}
}
class C { }
protocol P3 {
associatedtype A
func f<T: P3>(_: T) where T.A == Self.A, T.A: C // expected-error{{instance method requirement 'f' cannot add constraint 'Self.A: C' on 'Self'}}
func g<T: P3>(_: T) where T.A: C, T.A == Self.A // expected-error{{instance method requirement 'g' cannot add constraint 'Self.A: C' on 'Self'}}
}
protocol Base {
associatedtype Assoc
}
protocol Sub1: Base {
associatedtype SubAssoc: Assoc
// expected-error@-1 {{type 'Self.SubAssoc' constrained to non-protocol, non-class type 'Self.Assoc'}}
}
// FIXME: This error is incorrect in what it states.
protocol Sub2: Base {
associatedtype SubAssoc where SubAssoc: Assoc // expected-error {{type 'Self.SubAssoc' constrained to non-protocol, non-class type 'Self.Assoc'}}
}
struct S {}
// FIX-ME: One of these errors is redundant.
protocol P4 {
associatedtype X : S
// expected-error@-1 {{type 'Self.X' constrained to non-protocol, non-class type 'S'}}
}
protocol P5 {
associatedtype Y where Y : S // expected-error {{type 'Self.Y' constrained to non-protocol, non-class type 'S'}}
}
protocol P6 {
associatedtype T
associatedtype U
func foo() where T == U
// expected-error@-1 {{instance method requirement 'foo()' cannot add constraint 'Self.T == Self.U' on 'Self'}}
// expected-note@-2 {{protocol requires function 'foo()' with type '() -> ()'}}
}
struct S2 : P6 {
// expected-error@-1 {{type 'S2' does not conform to protocol 'P6'}}
// expected-note@-2 {{add stubs for conformance}}
typealias T = Int
typealias U = String
func foo() {}
// expected-note@-1 {{candidate would match if 'S2.T' (aka 'Int') was the same type as 'S2.U' (aka 'String')}}
// FIXME: This error is bogus and should be omitted on account of the protocol requirement itself
// being invalid.
}
// This used to emit a diagnostic with a canonical type in it.
protocol P7 {
associatedtype A
func f() // expected-note {{protocol requires function 'f()' with type '() -> ()'}}
}
extension P7 where A: Equatable {
func f() {} // expected-note {{candidate would match if 'C7<T>.A' (aka 'T') conformed to 'Equatable'}}
}
class C7<T>: P7 { // expected-error {{type 'C7<T>' does not conform to protocol 'P7'}}
// expected-note@-1 {{add stubs for conformance}}
typealias A = T
}