|
1 |
| -// RUN: %target-typecheck-verify-swift |
| 1 | +// RUN: %target-typecheck-verify-swift -enable-experimental-feature NoncopyableGenerics |
2 | 2 |
|
3 | 3 | protocol HasSelfRequirements {
|
4 | 4 | func foo(_ x: Self)
|
@@ -57,6 +57,9 @@ typealias T2 = any Pub & Bar
|
57 | 57 | protocol HasAssoc {
|
58 | 58 | associatedtype Assoc
|
59 | 59 | func foo()
|
| 60 | + |
| 61 | + typealias HasAssoc_Alias = HasAssoc |
| 62 | + typealias Int_Alias = Int |
60 | 63 | }
|
61 | 64 |
|
62 | 65 | do {
|
@@ -279,61 +282,185 @@ do {
|
279 | 282 | let _: Codable
|
280 | 283 | }
|
281 | 284 |
|
282 |
| -func testAnyFixIt() { |
283 |
| - struct ConformingType : HasAssoc { |
284 |
| - typealias Assoc = Int |
285 |
| - func foo() {} |
| 285 | +protocol HasAssocGeneric<Assoc> { |
| 286 | + associatedtype Assoc |
| 287 | +} |
286 | 288 |
|
287 |
| - func method() -> any HasAssoc {} |
| 289 | +protocol NonCopyableHasAssoc: ~Copyable { |
| 290 | + associatedtype Assoc |
| 291 | +} |
| 292 | + |
| 293 | +func testAnyFixIt() { |
| 294 | + struct S { |
| 295 | + typealias HasAssoc_Alias = HasAssoc |
| 296 | + typealias HasAssocGeneric_Alias = HasAssocGeneric |
| 297 | + typealias Copyable_Alias = Copyable |
| 298 | + |
| 299 | + typealias G<T> = Self |
| 300 | + typealias NonCopyable_G<T: ~Copyable> = Self |
| 301 | + typealias S = Self |
288 | 302 | }
|
| 303 | + typealias G<T> = S |
| 304 | + typealias NonCopyable_G<T: ~Copyable> = S |
289 | 305 |
|
290 | 306 | // expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-18=any HasAssoc}}
|
291 |
| - let _: HasAssoc = ConformingType() |
| 307 | + let _: HasAssoc |
| 308 | + // expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{10-10=any }} |
| 309 | + let _: ~Copyable |
| 310 | + // expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{11-19=any HasAssoc}} |
| 311 | + let _: (HasAssoc) |
| 312 | + // expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{10-10=any }} |
| 313 | + let _: ~(Copyable) |
292 | 314 | // expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{19-27=any HasAssoc}}
|
293 |
| - let _: Optional<HasAssoc> = nil |
| 315 | + let _: Optional<HasAssoc> |
| 316 | + // expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{19-19=any }} |
| 317 | + let _: Optional<~Copyable> |
| 318 | + // FIXME: No fix-it + generic argument not diagnosed. |
| 319 | + // expected-error@+1 {{use of protocol 'HasAssocGeneric<any HasAssoc>' as a type must be written 'any HasAssocGeneric<any HasAssoc>'}}{{none}} |
| 320 | + let _: HasAssocGeneric<HasAssoc> |
| 321 | + // expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{14-22=any HasAssoc}} |
| 322 | + let _: S.G<HasAssoc> |
| 323 | + // expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{26-26=any }} |
| 324 | + let _: S.NonCopyable_G<~Copyable> |
| 325 | + // expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{12-20=any HasAssoc}} |
| 326 | + let _: G<HasAssoc>.S |
| 327 | + // expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{24-24=any }} |
| 328 | + let _: NonCopyable_G<~Copyable>.S |
| 329 | + // expected-error@+2 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{12-20=any HasAssoc}} |
| 330 | + // expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{24-32=any HasAssoc}} |
| 331 | + let _: G<HasAssoc>.G<HasAssoc> |
| 332 | + // expected-error@+2 {{constraint that suppresses conformance requires 'any'}}{{24-24=any }} |
| 333 | + // expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{49-49=any }} |
| 334 | + let _: NonCopyable_G<~Copyable>.NonCopyable_G<~Copyable> |
| 335 | + // expected-error@+2 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{12-20=any HasAssoc}} |
| 336 | + // expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{24-32=any HasAssoc}} |
| 337 | + let _: G<HasAssoc>.G<HasAssoc>.S |
| 338 | + // expected-error@+2 {{constraint that suppresses conformance requires 'any'}}{{24-24=any }} |
| 339 | + // expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{49-49=any }} |
| 340 | + let _: NonCopyable_G<~Copyable>.NonCopyable_G<~Copyable>.S |
| 341 | + // expected-error@+1 {{use of 'S.HasAssoc_Alias' (aka 'HasAssoc') as a type must be written 'any S.HasAssoc_Alias' (aka 'any HasAssoc')}}{{10-26=any S.HasAssoc_Alias}} |
| 342 | + let _: S.HasAssoc_Alias |
| 343 | + // expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{10-10=any }} |
| 344 | + let _: ~S.Copyable_Alias |
| 345 | + // expected-error@+2 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{12-20=any HasAssoc}} |
| 346 | + // expected-error@+1 {{use of 'S.HasAssoc_Alias' (aka 'HasAssoc') as a type must be written 'any S.HasAssoc_Alias' (aka 'any HasAssoc')}}{{10-36=any G<HasAssoc>.HasAssoc_Alias}} |
| 347 | + let _: G<HasAssoc>.HasAssoc_Alias |
| 348 | + // FIXME: Generic argument not diagnosed. |
| 349 | + // expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{10-10=any }} |
| 350 | + let _: ~G<HasAssoc>.Copyable_Alias |
| 351 | + // FIXME: No fix-it + generic argument not diagnosed. |
| 352 | + // expected-error@+1 {{use of 'HasAssocGeneric<any HasAssoc>' as a type must be written 'any HasAssocGeneric<any HasAssoc>}}{{none}} |
| 353 | + let _: S.HasAssocGeneric_Alias<HasAssoc> |
| 354 | + // FIXME: No diagnostic. |
| 355 | + let _: HasAssoc.Int_Alias |
| 356 | + let _: HasAssoc.HasAssoc_Alias.Int_Alias |
294 | 357 | // expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-23=any HasAssoc.Type}}
|
295 |
| - let _: HasAssoc.Type = ConformingType.self |
| 358 | + let _: HasAssoc.Type |
| 359 | + // expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{10-10=any }} |
| 360 | + let _: ~Copyable.Type |
296 | 361 | // expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-25=any (HasAssoc).Type}}
|
297 |
| - let _: (HasAssoc).Type = ConformingType.self |
| 362 | + let _: (HasAssoc).Type |
| 363 | + // FIXME: Fix-it produces singleton, not existential, metatype type? |
| 364 | + // expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{11-11=any }} |
| 365 | + let _: (~Copyable).Type |
298 | 366 | // expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-27=any ((HasAssoc)).Type}}
|
299 |
| - let _: ((HasAssoc)).Type = ConformingType.self |
| 367 | + let _: ((HasAssoc)).Type |
| 368 | + // FIXME: Fix-it produces singleton, not existential, metatype type? |
| 369 | + // expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{12-12=any }} |
| 370 | + let _: ((~Copyable)).Type |
| 371 | + // expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-23=any HasAssoc.Type}} |
| 372 | + let _: HasAssoc.Type.Type |
| 373 | + // expected-error@+1 {{type 'any Copyable.Type.Type' cannot be suppressed}} |
| 374 | + let _: ~Copyable.Type.Type |
| 375 | + // FIXME: Fix-it produces singleton, not existential, metatype type? |
| 376 | + // expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{11-11=any }} |
| 377 | + let _: (~Copyable).Type.Type |
300 | 378 | // expected-error@+2 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-18=(any HasAssoc)}}
|
301 | 379 | // expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{30-38=(any HasAssoc)}}
|
302 | 380 | let _: HasAssoc.Protocol = HasAssoc.self
|
| 381 | + // expected-error@+2 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{11-19=any HasAssoc}} |
| 382 | + // expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{33-41=any HasAssoc}} |
| 383 | + let _: (HasAssoc).Protocol = (HasAssoc).self |
| 384 | + // expected-error@+1 {{type '(any Copyable).Type' cannot be suppressed}} |
| 385 | + let _: ~Copyable.Protocol |
| 386 | + // expected-error@+2 {{constraint that suppresses conformance requires 'any'}}{{11-11=any }} |
| 387 | + // expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{34-34=any }} |
| 388 | + let _: (~Copyable).Protocol = (~Copyable).self |
| 389 | + // expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-18=(any HasAssoc)}} |
| 390 | + let _: HasAssoc.Protocol.Type.Type |
| 391 | + // expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{11-11=any }} |
| 392 | + let _: (~Copyable).Protocol.Type.Type |
303 | 393 | do {
|
304 |
| - struct Wrapper { |
305 |
| - typealias HasAssocAlias = HasAssoc |
306 |
| - } |
307 |
| - let wrapperMeta: Wrapper.Type |
| 394 | + let meta: S.Type |
308 | 395 | // FIXME: What is the correct fix-it for the initializer?
|
309 | 396 | //
|
310 |
| - // expected-error@+2:20 {{use of 'Wrapper.HasAssocAlias' (aka 'HasAssoc') as a type must be written 'any Wrapper.HasAssocAlias' (aka 'any HasAssoc')}}{{12-33=(any Wrapper.HasAssocAlias)}} |
311 |
| - // expected-error@+1:57 {{use of 'Wrapper.HasAssocAlias' (aka 'HasAssoc') as a type must be written 'any Wrapper.HasAssocAlias' (aka 'any HasAssoc')}}{{57-70=(any HasAssocAlias)}} |
312 |
| - let _: Wrapper.HasAssocAlias.Protocol = wrapperMeta.HasAssocAlias.self |
| 397 | + // expected-error@+2:14 {{use of 'S.HasAssoc_Alias' (aka 'HasAssoc') as a type must be written 'any S.HasAssoc_Alias' (aka 'any HasAssoc')}}{{12-28=(any S.HasAssoc_Alias)}} |
| 398 | + // expected-error@+1:45 {{use of 'S.HasAssoc_Alias' (aka 'HasAssoc') as a type must be written 'any S.HasAssoc_Alias' (aka 'any HasAssoc')}}{{45-59=(any HasAssoc_Alias)}} |
| 399 | + let _: S.HasAssoc_Alias.Protocol = meta.HasAssoc_Alias.self |
313 | 400 | }
|
314 |
| - // expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{11-19=any HasAssoc}} |
315 |
| - let _: (HasAssoc).Protocol = (any HasAssoc).self |
| 401 | + // expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-23=(any HasAssoc.Type)}} |
| 402 | + let _: HasAssoc.Type.Protocol |
| 403 | + // expected-error@+1 {{type '(any Copyable.Type).Type' cannot be suppressed}} |
| 404 | + let _: ~Copyable.Type.Protocol |
| 405 | + // FIXME: Incorrect fix-it. |
| 406 | + // expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{11-11=any }} |
| 407 | + let _: (~Copyable).Type.Protocol |
| 408 | + // FIXME: Incorrect fix-it. |
| 409 | + // expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-23=any HasAssoc.Type}} |
| 410 | + let _: HasAssoc.Type.Type.Protocol |
| 411 | + // FIXME: Incorrect fix-it. |
| 412 | + // expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{11-11=any }} |
| 413 | + let _: (~Copyable).Type.Type.Protocol |
316 | 414 | // expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-18=(any HasAssoc)}}
|
317 |
| - let _: HasAssoc? = ConformingType() |
| 415 | + let _: HasAssoc? |
| 416 | + // expected-error@+1 {{type '(any Copyable)?' cannot be suppressed}} |
| 417 | + let _: ~Copyable? |
| 418 | + // expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{11-19=any HasAssoc}} |
| 419 | + let _: (HasAssoc)? |
| 420 | + // expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{11-11=any }} |
| 421 | + let _: (~Copyable)? |
318 | 422 | // expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-23=(any HasAssoc.Type)}}
|
319 |
| - let _: HasAssoc.Type? = ConformingType.self |
| 423 | + let _: HasAssoc.Type? |
| 424 | + // FIXME: Fix-it produces singleton, not existential, metatype type? |
| 425 | + // expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{11-11=any }} |
| 426 | + let _: (~Copyable).Type? |
320 | 427 | // expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-18=(any HasAssoc)}}
|
321 |
| - let _: HasAssoc.Protocol? = (any HasAssoc).self |
| 428 | + let _: HasAssoc.Protocol? |
| 429 | + // expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{11-11=any }} |
| 430 | + let _: (~Copyable).Protocol? |
| 431 | + // expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{21-29=any HasAssoc}} |
| 432 | + let _: (borrowing HasAssoc) -> Void |
| 433 | + // expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{21-21=any }} |
| 434 | + let _: (borrowing ~Copyable) -> Void |
| 435 | + // https://github.com/apple/swift/issues/72588 |
| 436 | + // FIXME: No diagnostic. |
| 437 | + let _: any HasAssocGeneric<HasAssoc> |
| 438 | + let _: any HasAssocGeneric<~Copyable> |
| 439 | + let _: any G<HasAssoc>.HasAssoc_Alias |
| 440 | + let _: any ~G<HasAssoc>.Copyable_Alias |
| 441 | + do { |
| 442 | + func f(_: some G<HasAssoc>.HasAssoc_Alias) {} |
| 443 | + } |
322 | 444 |
|
323 |
| - // expected-error@+1 {{optional 'any' type must be written '(any HasAssoc)?'}}{{10-23=(any HasAssoc)?}} |
324 |
| - let _: any HasAssoc? = nil |
325 |
| - // expected-error@+1 {{optional 'any' type must be written '(any HasAssoc.Type)?'}}{{10-28=(any HasAssoc.Type)?}} |
326 |
| - let _: any HasAssoc.Type? = nil |
| 445 | + // Misc. compound cases. |
327 | 446 |
|
328 |
| - do { |
329 |
| - struct Outer<T> { |
330 |
| - struct Inner<U> {} |
331 |
| - } |
| 447 | + // FIXME: Incorrect fix-it for 'NonCopyableHasAssoc'. |
| 448 | + // expected-error@+2 {{constraint that suppresses conformance requires 'any'}}{{21-21=any }} |
| 449 | + // expected-error@+1 {{use of protocol 'NonCopyableHasAssoc' as a type must be written 'any NonCopyableHasAssoc'}}{{21-40=any NonCopyableHasAssoc}} |
| 450 | + let _: (borrowing NonCopyableHasAssoc & ~Copyable) -> Void |
332 | 451 |
|
333 |
| - // expected-error@+2:18 {{must be written 'any HasAssoc'}} |
334 |
| - // expected-error@+1:34 {{must be written 'any HasAssoc'}} |
335 |
| - let _: Outer<HasAssoc>.Inner<HasAssoc> |
336 |
| - } |
| 452 | + // Misplaced '?'. |
| 453 | + |
| 454 | + // expected-error@+1 {{optional 'any' type must be written '(any HasAssoc)?'}}{{10-23=(any HasAssoc)?}} |
| 455 | + let _: any HasAssoc? |
| 456 | + // FIXME: Better recovery |
| 457 | + // expected-error@+1 {{type '(any Copyable)?' cannot be suppressed}} |
| 458 | + let _: any ~Copyable? |
| 459 | + // expected-error@+1 {{optional 'any' type must be written '(any HasAssoc.Type)?'}}{{10-28=(any HasAssoc.Type)?}} |
| 460 | + let _: any HasAssoc.Type? |
| 461 | + // FIXME: Better recovery |
| 462 | + // expected-error@+1 {{type '(any Copyable.Type)?' cannot be suppressed}} |
| 463 | + let _: any ~Copyable.Type? |
337 | 464 | }
|
338 | 465 |
|
339 | 466 | func testNestedMetatype() {
|
|
0 commit comments