44
55public protocol Horse { }
66func takesHorse< T : Horse > ( _: T ) { }
7+ func takesHorseExistential( _: Horse ) { }
78
89extension Horse {
910 func giddyUp( ) { }
@@ -17,10 +18,11 @@ public struct HasUnavailableConformance1 {}
1718
1819@available ( * , unavailable)
1920extension HasUnavailableConformance1 : Horse { }
20- // expected-note@-1 6 {{conformance of 'HasUnavailableConformance1' to 'Horse' has been explicitly marked unavailable here}}
21+ // expected-note@-1 7 {{conformance of 'HasUnavailableConformance1' to 'Horse' has been explicitly marked unavailable here}}
2122
2223func passUnavailableConformance1( x: HasUnavailableConformance1 ) {
2324 takesHorse ( x) // expected-error {{conformance of 'HasUnavailableConformance1' to 'Horse' is unavailable}}
25+ takesHorseExistential ( x) // expected-error {{conformance of 'HasUnavailableConformance1' to 'Horse' is unavailable}}
2426 x. giddyUp ( ) // expected-error {{conformance of 'HasUnavailableConformance1' to 'Horse' is unavailable}}
2527 _ = x. isGalloping // expected-error {{conformance of 'HasUnavailableConformance1' to 'Horse' is unavailable}}
2628 _ = x [ keyPath: \. isGalloping] // expected-error {{conformance of 'HasUnavailableConformance1' to 'Horse' is unavailable}}
@@ -30,6 +32,7 @@ func passUnavailableConformance1(x: HasUnavailableConformance1) {
3032@available ( * , unavailable)
3133func passUnavailableConformance1a( x: HasUnavailableConformance1 ) {
3234 takesHorse ( x)
35+ takesHorseExistential ( x)
3336 x. giddyUp ( )
3437 _ = x. isGalloping
3538 _ = x [ keyPath: \. isGalloping]
@@ -41,10 +44,11 @@ public struct HasUnavailableConformance2 {}
4144
4245@available ( macOS, unavailable)
4346extension HasUnavailableConformance2 : Horse { }
44- // expected-note@-1 5 {{conformance of 'HasUnavailableConformance2' to 'Horse' has been explicitly marked unavailable here}}
47+ // expected-note@-1 6 {{conformance of 'HasUnavailableConformance2' to 'Horse' has been explicitly marked unavailable here}}
4548
4649func passUnavailableConformance2( x: HasUnavailableConformance2 ) {
4750 takesHorse ( x) // expected-error {{conformance of 'HasUnavailableConformance2' to 'Horse' is unavailable in macOS}}
51+ takesHorseExistential ( x) // expected-error {{conformance of 'HasUnavailableConformance2' to 'Horse' is unavailable in macOS}}
4852 x. giddyUp ( ) // expected-error {{conformance of 'HasUnavailableConformance2' to 'Horse' is unavailable in macOS}}
4953 _ = x. isGalloping // expected-error {{conformance of 'HasUnavailableConformance2' to 'Horse' is unavailable in macOS}}
5054 _ = x [ keyPath: \. isGalloping] // expected-error {{conformance of 'HasUnavailableConformance2' to 'Horse' is unavailable in macOS}}
@@ -55,6 +59,7 @@ func passUnavailableConformance2(x: HasUnavailableConformance2) {
5559func passUnavailableConformance2a( x: HasUnavailableConformance2 ) {
5660 // This is allowed
5761 takesHorse ( x)
62+ takesHorseExistential ( x)
5863 x. giddyUp ( )
5964 _ = x. isGalloping
6065 _ = x [ keyPath: \. isGalloping]
@@ -65,10 +70,11 @@ public struct HasUnavailableConformance3 {}
6570
6671@available ( swift 12 )
6772extension HasUnavailableConformance3 : Horse { }
68- // expected-note@-1 10 {{conformance of 'HasUnavailableConformance3' to 'Horse' was introduced in Swift 12}}
73+ // expected-note@-1 12 {{conformance of 'HasUnavailableConformance3' to 'Horse' was introduced in Swift 12}}
6974
7075func passUnavailableConformance3( x: HasUnavailableConformance3 ) {
7176 takesHorse ( x) // expected-error {{conformance of 'HasUnavailableConformance3' to 'Horse' is unavailable}}
77+ takesHorseExistential ( x) // expected-error {{conformance of 'HasUnavailableConformance3' to 'Horse' is unavailable}}
7278 x. giddyUp ( ) // expected-error {{conformance of 'HasUnavailableConformance3' to 'Horse' is unavailable}}
7379 _ = x. isGalloping // expected-error {{conformance of 'HasUnavailableConformance3' to 'Horse' is unavailable}}
7480 _ = x [ keyPath: \. isGalloping] // expected-error {{conformance of 'HasUnavailableConformance3' to 'Horse' is unavailable}}
@@ -78,6 +84,7 @@ func passUnavailableConformance3(x: HasUnavailableConformance3) {
7884@available ( swift 12 )
7985func passUnavailableConformance3a( x: HasUnavailableConformance3 ) {
8086 takesHorse ( x) // expected-error {{conformance of 'HasUnavailableConformance3' to 'Horse' is unavailable}}
87+ takesHorseExistential ( x) // expected-error {{conformance of 'HasUnavailableConformance3' to 'Horse' is unavailable}}
8188 x. giddyUp ( ) // expected-error {{conformance of 'HasUnavailableConformance3' to 'Horse' is unavailable}}
8289 _ = x. isGalloping // expected-error {{conformance of 'HasUnavailableConformance3' to 'Horse' is unavailable}}
8390 _ = x [ keyPath: \. isGalloping] // expected-error {{conformance of 'HasUnavailableConformance3' to 'Horse' is unavailable}}
@@ -89,10 +96,11 @@ public struct HasUnavailableConformance4 {}
8996
9097@available ( macOS, obsoleted: 10.1 )
9198extension HasUnavailableConformance4 : Horse { }
92- // expected-note@-1 10 {{conformance of 'HasUnavailableConformance4' to 'Horse' was obsoleted in macOS 10.1}}
99+ // expected-note@-1 12 {{conformance of 'HasUnavailableConformance4' to 'Horse' was obsoleted in macOS 10.1}}
93100
94101func passUnavailableConformance4( x: HasUnavailableConformance4 ) {
95102 takesHorse ( x) // expected-error {{conformance of 'HasUnavailableConformance4' to 'Horse' is unavailable in macOS}}
103+ takesHorseExistential ( x) // expected-error {{conformance of 'HasUnavailableConformance4' to 'Horse' is unavailable in macOS}}
96104 x. giddyUp ( ) // expected-error {{conformance of 'HasUnavailableConformance4' to 'Horse' is unavailable in macOS}}
97105 _ = x. isGalloping // expected-error {{conformance of 'HasUnavailableConformance4' to 'Horse' is unavailable}}
98106 _ = x [ keyPath: \. isGalloping] // expected-error {{conformance of 'HasUnavailableConformance4' to 'Horse' is unavailable}}
@@ -102,6 +110,7 @@ func passUnavailableConformance4(x: HasUnavailableConformance4) {
102110@available ( macOS, obsoleted: 10.1 )
103111func passUnavailableConformance4a( x: HasUnavailableConformance4 ) {
104112 takesHorse ( x) // expected-error {{conformance of 'HasUnavailableConformance4' to 'Horse' is unavailable in macOS}}
113+ takesHorseExistential ( x) // expected-error {{conformance of 'HasUnavailableConformance4' to 'Horse' is unavailable in macOS}}
105114 x. giddyUp ( ) // expected-error {{conformance of 'HasUnavailableConformance4' to 'Horse' is unavailable in macOS}}
106115 _ = x. isGalloping // expected-error {{conformance of 'HasUnavailableConformance4' to 'Horse' is unavailable}}
107116 _ = x [ keyPath: \. isGalloping] // expected-error {{conformance of 'HasUnavailableConformance4' to 'Horse' is unavailable}}
@@ -113,10 +122,11 @@ public struct HasUnavailableConformance5 {}
113122
114123@available ( swift, obsoleted: 4 )
115124extension HasUnavailableConformance5 : Horse { }
116- // expected-note@-1 10 {{conformance of 'HasUnavailableConformance5' to 'Horse' was obsoleted in Swift 4}}
125+ // expected-note@-1 12 {{conformance of 'HasUnavailableConformance5' to 'Horse' was obsoleted in Swift 4}}
117126
118127func passUnavailableConformance5( x: HasUnavailableConformance5 ) {
119128 takesHorse ( x) // expected-error {{conformance of 'HasUnavailableConformance5' to 'Horse' is unavailable}}
129+ takesHorseExistential ( x) // expected-error {{conformance of 'HasUnavailableConformance5' to 'Horse' is unavailable}}
120130 x. giddyUp ( ) // expected-error {{conformance of 'HasUnavailableConformance5' to 'Horse' is unavailable}}
121131 _ = x. isGalloping // expected-error {{conformance of 'HasUnavailableConformance5' to 'Horse' is unavailable}}
122132 _ = x [ keyPath: \. isGalloping] // expected-error {{conformance of 'HasUnavailableConformance5' to 'Horse' is unavailable}}
@@ -126,6 +136,7 @@ func passUnavailableConformance5(x: HasUnavailableConformance5) {
126136@available ( swift, obsoleted: 4 )
127137func passUnavailableConformance5a( x: HasUnavailableConformance5 ) {
128138 takesHorse ( x) // expected-error {{conformance of 'HasUnavailableConformance5' to 'Horse' is unavailable}}
139+ takesHorseExistential ( x) // expected-error {{conformance of 'HasUnavailableConformance5' to 'Horse' is unavailable}}
129140 x. giddyUp ( ) // expected-error {{conformance of 'HasUnavailableConformance5' to 'Horse' is unavailable}}
130141 _ = x. isGalloping // expected-error {{conformance of 'HasUnavailableConformance5' to 'Horse' is unavailable}}
131142 _ = x [ keyPath: \. isGalloping] // expected-error {{conformance of 'HasUnavailableConformance5' to 'Horse' is unavailable}}
@@ -137,10 +148,11 @@ public struct HasUnavailableConformance6 {}
137148
138149@available ( * , unavailable, message: " This conformance is bad " )
139150extension HasUnavailableConformance6 : Horse { }
140- // expected-note@-1 5 {{conformance of 'HasUnavailableConformance6' to 'Horse' has been explicitly marked unavailable here}}
151+ // expected-note@-1 6 {{conformance of 'HasUnavailableConformance6' to 'Horse' has been explicitly marked unavailable here}}
141152
142153func passUnavailableConformance6( x: HasUnavailableConformance6 ) {
143154 takesHorse ( x) // expected-error {{conformance of 'HasUnavailableConformance6' to 'Horse' is unavailable: This conformance is bad}}
155+ takesHorseExistential ( x) // expected-error {{conformance of 'HasUnavailableConformance6' to 'Horse' is unavailable: This conformance is bad}}
144156 x. giddyUp ( ) // expected-error {{conformance of 'HasUnavailableConformance6' to 'Horse' is unavailable: This conformance is bad}}
145157 _ = x. isGalloping // expected-error {{conformance of 'HasUnavailableConformance6' to 'Horse' is unavailable: This conformance is bad}}
146158 _ = x [ keyPath: \. isGalloping] // expected-error {{conformance of 'HasUnavailableConformance6' to 'Horse' is unavailable: This conformance is bad}}
@@ -155,6 +167,7 @@ extension HasDeprecatedConformance1 : Horse {}
155167
156168func passDeprecatedConformance1( x: HasDeprecatedConformance1 ) {
157169 takesHorse ( x) // expected-warning {{conformance of 'HasDeprecatedConformance1' to 'Horse' is deprecated}}
170+ takesHorseExistential ( x) // expected-warning {{conformance of 'HasDeprecatedConformance1' to 'Horse' is deprecated}}
158171 x. giddyUp ( ) // expected-warning {{conformance of 'HasDeprecatedConformance1' to 'Horse' is deprecated}}
159172 _ = x. isGalloping // expected-warning {{conformance of 'HasDeprecatedConformance1' to 'Horse' is deprecated}}
160173 _ = x [ keyPath: \. isGalloping] // expected-warning {{conformance of 'HasDeprecatedConformance1' to 'Horse' is deprecated}}
@@ -164,6 +177,7 @@ func passDeprecatedConformance1(x: HasDeprecatedConformance1) {
164177@available ( * , deprecated)
165178func passDeprecatedConformance1a( x: HasDeprecatedConformance1 ) {
166179 takesHorse ( x)
180+ takesHorseExistential ( x)
167181 x. giddyUp ( )
168182 _ = x. isGalloping
169183 _ = x [ keyPath: \. isGalloping]
@@ -178,6 +192,7 @@ extension HasDeprecatedConformance2 : Horse {}
178192
179193func passDeprecatedConformance2( x: HasDeprecatedConformance2 ) {
180194 takesHorse ( x) // expected-warning {{conformance of 'HasDeprecatedConformance2' to 'Horse' is deprecated: This conformance is deprecated}}
195+ takesHorseExistential ( x) // expected-warning {{conformance of 'HasDeprecatedConformance2' to 'Horse' is deprecated: This conformance is deprecated}}
181196 x. giddyUp ( ) // expected-warning {{conformance of 'HasDeprecatedConformance2' to 'Horse' is deprecated: This conformance is deprecated}}
182197 _ = x. isGalloping // expected-warning {{conformance of 'HasDeprecatedConformance2' to 'Horse' is deprecated: This conformance is deprecated}}
183198 _ = x [ keyPath: \. isGalloping] // expected-warning {{conformance of 'HasDeprecatedConformance2' to 'Horse' is deprecated: This conformance is deprecated}}
@@ -187,6 +202,7 @@ func passDeprecatedConformance2(x: HasDeprecatedConformance2) {
187202@available ( * , deprecated)
188203func passDeprecatedConformance2a( x: HasDeprecatedConformance2 ) {
189204 takesHorse ( x)
205+ takesHorseExistential ( x)
190206 x. giddyUp ( )
191207 _ = x. isGalloping
192208 _ = x [ keyPath: \. isGalloping]
@@ -201,6 +217,7 @@ extension HasDeprecatedConformance3 : Horse {}
201217
202218func passDeprecatedConformance3( x: HasDeprecatedConformance3 ) {
203219 takesHorse ( x) // expected-warning {{conformance of 'HasDeprecatedConformance3' to 'Horse' was deprecated in macOS 10.8}}
220+ takesHorseExistential ( x) // expected-warning {{conformance of 'HasDeprecatedConformance3' to 'Horse' was deprecated in macOS 10.8}}
204221 x. giddyUp ( ) // expected-warning {{conformance of 'HasDeprecatedConformance3' to 'Horse' was deprecated in macOS 10.8}}
205222 _ = x. isGalloping // expected-warning {{conformance of 'HasDeprecatedConformance3' to 'Horse' was deprecated in macOS 10.8}}
206223 _ = x [ keyPath: \. isGalloping] // expected-warning {{conformance of 'HasDeprecatedConformance3' to 'Horse' was deprecated in macOS 10.8}}
@@ -213,6 +230,7 @@ func passDeprecatedConformance3a(x: HasDeprecatedConformance3) {
213230 // This branch is dead with our minimum deployment target, so don't emit
214231 // deprecation diagnostics in it.
215232 takesHorse ( x)
233+ takesHorseExistential ( x)
216234 x. giddyUp ( )
217235 _ = x. isGalloping
218236 _ = x [ keyPath: \. isGalloping]
@@ -231,10 +249,13 @@ extension HasAvailableConformance1 : Horse {}
231249// in test/Sema/conformance_availability_warn.swift for the same example
232250// but without this flag.
233251
234- func passAvailableConformance1( x: HasAvailableConformance1 ) { // expected-note 5 {{add @available attribute to enclosing global function}}
252+ func passAvailableConformance1( x: HasAvailableConformance1 ) { // expected-note 6 {{add @available attribute to enclosing global function}}
235253 takesHorse ( x) // expected-error {{conformance of 'HasAvailableConformance1' to 'Horse' is only available in macOS 100 or newer}}
236254 // expected-note@-1 {{add 'if #available' version check}}
237255
256+ takesHorseExistential ( x) // expected-error {{conformance of 'HasAvailableConformance1' to 'Horse' is only available in macOS 100 or newer}}
257+ // expected-note@-1 {{add 'if #available' version check}}
258+
238259 x. giddyUp ( ) // expected-error {{conformance of 'HasAvailableConformance1' to 'Horse' is only available in macOS 100 or newer}}
239260 // expected-note@-1 {{add 'if #available' version check}}
240261
@@ -251,6 +272,7 @@ func passAvailableConformance1(x: HasAvailableConformance1) { // expected-note 5
251272@available ( macOS 100 , * )
252273func passAvailableConformance1a( x: HasAvailableConformance1 ) {
253274 takesHorse ( x)
275+ takesHorseExistential ( x)
254276 x. giddyUp ( )
255277 _ = x. isGalloping
256278 _ = x [ keyPath: \. isGalloping]
0 commit comments