|
1 |
| -// RUN: %target-run-simple-swift |
| 1 | +// RUN: %target-run-simple-swift(-enable-experimental-feature NonescapableTypes) |
2 | 2 | // REQUIRES: executable_test
|
3 | 3 | // REQUIRES: reflection
|
4 | 4 |
|
@@ -426,4 +426,62 @@ OptionalTests.test("unsafelyUnwrapped nil")
|
426 | 426 | }
|
427 | 427 | #endif
|
428 | 428 |
|
| 429 | +func isCopyable<T: ~Copyable & ~Escapable>(_: T.Type) -> Bool { false } |
| 430 | +func isCopyable<T: ~Escapable>(_: T.Type) -> Bool { true } |
| 431 | + |
| 432 | +func isBitwiseCopyable<T: ~Copyable & ~Escapable>(_: T.Type) -> Bool { false } |
| 433 | +func isBitwiseCopyable<T: BitwiseCopyable & ~Escapable>(_: T.Type) -> Bool { true } |
| 434 | + |
| 435 | +#if $NonescapableTypes |
| 436 | +func isEscapable<T: ~Escapable & ~Copyable>(_: T.Type) -> Bool { false } |
| 437 | +func isEscapable<T: ~Copyable>(_: T.Type) -> Bool { true } |
| 438 | +#endif |
| 439 | + |
| 440 | +struct TrivialStruct {} |
| 441 | +struct NoncopyableStruct: ~Copyable {} |
| 442 | +class RegularClass {} |
| 443 | + |
| 444 | +#if $NonescapableTypes |
| 445 | +struct NonescapableStruct: ~Escapable, BitwiseCopyable {} |
| 446 | +struct NoncopyableNonescapableStruct: ~Copyable, ~Escapable {} |
| 447 | +struct NonescapableNontrivialStruct: ~Escapable { |
| 448 | + let foo: RegularClass? = nil |
| 449 | +} |
| 450 | +#endif |
| 451 | + |
| 452 | +OptionalTests.test("Copyability") { |
| 453 | + expectTrue(isCopyable(Optional<TrivialStruct>.self)) |
| 454 | + expectFalse(isCopyable(Optional<NoncopyableStruct>.self)) |
| 455 | + expectTrue(isCopyable(Optional<RegularClass>.self)) |
| 456 | +#if $NonescapableTypes |
| 457 | + expectTrue(isCopyable(Optional<NonescapableStruct>.self)) |
| 458 | + expectFalse(isCopyable(Optional<NoncopyableNonescapableStruct>.self)) |
| 459 | + expectTrue(isCopyable(Optional<NonescapableNontrivialStruct>.self)) |
| 460 | +#endif |
| 461 | +} |
| 462 | + |
| 463 | +OptionalTests.test("BitwiseCopyability") { |
| 464 | + expectTrue(isBitwiseCopyable(Optional<TrivialStruct>.self)) |
| 465 | + expectFalse(isBitwiseCopyable(Optional<NoncopyableStruct>.self)) |
| 466 | + expectFalse(isBitwiseCopyable(Optional<RegularClass>.self)) |
| 467 | +#if $NonescapableTypes |
| 468 | + // FIXME: Should this be true? |
| 469 | + expectFalse(isBitwiseCopyable(Optional<NonescapableStruct>.self)) |
| 470 | + |
| 471 | + expectFalse(isBitwiseCopyable(Optional<NoncopyableNonescapableStruct>.self)) |
| 472 | + expectFalse(isBitwiseCopyable(Optional<NonescapableNontrivialStruct>.self)) |
| 473 | +#endif |
| 474 | +} |
| 475 | + |
| 476 | +#if $NonescapableTypes |
| 477 | +OptionalTests.test("Escapability") { |
| 478 | + expectTrue(isEscapable(Optional<TrivialStruct>.self)) |
| 479 | + expectTrue(isEscapable(Optional<NoncopyableStruct>.self)) |
| 480 | + expectTrue(isEscapable(Optional<RegularClass>.self)) |
| 481 | + expectFalse(isEscapable(Optional<NonescapableStruct>.self)) |
| 482 | + expectFalse(isEscapable(Optional<NoncopyableNonescapableStruct>.self)) |
| 483 | + expectFalse(isEscapable(Optional<NonescapableNontrivialStruct>.self)) |
| 484 | +} |
| 485 | +#endif |
| 486 | + |
429 | 487 | runAllTests()
|
0 commit comments