|
| 1 | +// RUN: %target-typecheck-verify-swift -enable-experimental-feature NoncopyableGenerics |
| 2 | + |
| 3 | +// REQUIRES: asserts |
| 4 | + |
| 5 | +protocol U {} |
| 6 | + |
| 7 | +enum Maybe<Thing: ~Copyable> : ~Copyable {} |
| 8 | + |
| 9 | +func more() { |
| 10 | + let _: any ~Copyable = 19 |
| 11 | + |
| 12 | + let _: any ~Equatable = 19 // expected-error@:14 {{type 'Equatable' is not invertable}} |
| 13 | + |
| 14 | + let _: any (~Copyable & ~Equatable) // expected-error{{type 'Equatable' is not invertable}} |
| 15 | + |
| 16 | + let _: ~Any // expected-error {{type 'Any' is not invertable}} |
| 17 | + let _: ~AnyObject // expected-error {{type 'AnyObject' is not invertable}} |
| 18 | +} |
| 19 | + |
| 20 | +struct S4: ~(Copyable & Equatable) {} // expected-error {{type 'Copyable & Equatable' is not invertable}} |
| 21 | + |
| 22 | +func blah<T>(_ t: T) where T: ~Copyable, |
| 23 | + T: ~Hashable {} // expected-error@:31 {{type 'Hashable' is not invertable}} |
| 24 | + |
| 25 | +func foo<T: ~Copyable>(x: T) {} |
| 26 | + |
| 27 | +struct Buurap<T: ~Copyable> {} |
| 28 | + |
| 29 | +protocol Foo where Self: ~Copyable { |
| 30 | + func test<T>(_ t: T) where T: ~Self // expected-error {{type 'Self' is not invertable}} |
| 31 | +} |
| 32 | + |
| 33 | +protocol Sando { func make() } |
| 34 | + |
| 35 | +class C: ~Copyable, |
| 36 | + ~Sando // expected-error {{type 'Sando' is not invertable}} |
| 37 | + {} |
| 38 | + |
| 39 | +public struct MoveOnlyS1<T> : ~Copyable { /*deinit {}*/ } |
| 40 | +public struct MoveOnlyS2<T: Equatable> : ~Copyable { /*deinit {}*/ } |
| 41 | +public struct MoveOnlyS3<T: ~Copyable> : ~Copyable { /*deinit {}*/ } |
| 42 | + |
| 43 | +protocol Rope<Element>: Hashable, ~ Copyable { |
| 44 | + |
| 45 | + associatedtype Element: ~Copyable |
| 46 | +} |
| 47 | + |
| 48 | +extension S: ~Copyable {} |
| 49 | + |
| 50 | +struct S: ~U, // expected-error {{type 'U' is not invertable}} |
| 51 | + ~Copyable {} |
| 52 | + |
| 53 | +func greenBay<each T: ~Copyable>(_ r: repeat each T) {} |
| 54 | + |
| 55 | +typealias Clone = Copyable |
| 56 | +func dup<D: ~Clone>(_ d: D) {} |
| 57 | + |
| 58 | +func superb(_ thing: some ~Copyable, thing2: some ~Clone) {} |
| 59 | + |
| 60 | +func ownership1(_ t: borrowing any ~Equatable) {} // expected-error {{type 'Equatable' is not invertible}} |
| 61 | + |
| 62 | +func ownership2(_ t: ~ borrowing Int) {} // expected-error {{cannot find type 'borrowing' in scope}} |
| 63 | + // expected-error@-1 {{unnamed parameters must be written with the empty name '_'}} |
| 64 | + // expected-error@-2 {{expected ',' separator}} |
| 65 | + |
| 66 | +func ownership3(_ t: consuming some ~Clone) {} |
| 67 | + |
| 68 | +func what(one: ~Copyable..., // expected-error {{type 'any Copyable' is not invertible}} |
| 69 | + two: ~(Copyable...) // expected-error {{variadic parameter cannot appear outside of a function parameter list}} |
| 70 | + // expected-error@-1 {{type 'any Copyable' is not invertible}} |
| 71 | + ) {} |
| 72 | + |
| 73 | +struct A { struct B { struct C {} } } |
| 74 | + |
| 75 | +typealias Z1 = (~Copyable).Type // FIXME: should be an error |
| 76 | +typealias Z1 = ~Copyable.Type // expected-error {{type 'any Copyable.Type' is not invertable}} |
| 77 | +typealias Z2 = ~A.B.C // expected-error {{type 'A.B.C' is not invertable}} |
| 78 | +typealias Z3 = ~A? // expected-error {{type 'A?' is not invertable}} |
| 79 | +typealias Z4 = ~Rope<Int> // expected-error {{type 'Rope<Int>' is not invertable}} |
| 80 | +typealias Z5 = (~Int) -> Void // expected-error {{type 'Int' is not invertable}} |
| 81 | +typealias Z6 = ~() -> () // expected-error {{single argument function types require parentheses}} |
| 82 | + // expected-error@-1 {{type '()' is not invertable}} |
| 83 | +typealias Z7 = ~(Copyable & Hashable) // expected-error {{type 'Copyable & Hashable' is not invertable}} |
| 84 | +typealias Z8 = ~Copyable & Hashable |
0 commit comments