-
Notifications
You must be signed in to change notification settings - Fork 10.5k
/
Copy pathunsatisfiable.swift
99 lines (76 loc) · 3.12 KB
/
unsatisfiable.swift
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
// 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
}