|
2 | 2 | // RUN: -enable-experimental-feature NonescapableTypes \ |
3 | 3 | // RUN: -enable-experimental-feature SuppressedAssociatedTypes |
4 | 4 |
|
| 5 | +// expected-note@+1 {{'T' has '~Copyable' constraint preventing implicit 'Copyable' conformance}} |
| 6 | +struct AttemptImplicitConditionalConformance<T: ~Copyable>: ~Copyable { |
| 7 | + var t: T // expected-error {{stored property 't' of 'Copyable'-conforming generic struct 'AttemptImplicitConditionalConformance' has non-Copyable type 'T'}} |
| 8 | +} |
| 9 | +extension AttemptImplicitConditionalConformance: Copyable {} |
| 10 | +// expected-error@-1 {{generic struct 'AttemptImplicitConditionalConformance' required to be 'Copyable' but is marked with '~Copyable'}} |
| 11 | + |
| 12 | +enum Hello<T: ~Escapable & ~Copyable>: ~Escapable & ~Copyable {} |
| 13 | +extension Hello: Escapable {} // expected-error {{generic enum 'Hello' required to be 'Escapable' but is marked with '~Escapable'}} |
| 14 | +extension Hello: Copyable {} // expected-error {{generic enum 'Hello' required to be 'Copyable' but is marked with '~Copyable'}} |
| 15 | + |
| 16 | +enum HelloExplicitlyFixed<T: ~Escapable & ~Copyable>: Escapable, Copyable {} |
5 | 17 |
|
| 18 | +struct NoInverseBecauseNoDefault<T: ~Copyable & ~Escapable>: ~Copyable {} |
| 19 | +extension NoInverseBecauseNoDefault: Copyable where T: Copyable, T: ~Escapable {} |
| 20 | +// expected-error@-1 {{cannot suppress '~Escapable' on generic parameter 'T' defined in outer scope}} |
6 | 21 |
|
7 | 22 | // Check support for explicit conditional conformance |
8 | 23 | public struct ExplicitCond<T: ~Copyable>: ~Copyable {} |
9 | | -extension ExplicitCond: Copyable {} |
| 24 | +extension ExplicitCond: Copyable where T: Copyable {} |
10 | 25 | // expected-note@-1 {{requirement from conditional conformance}} |
11 | 26 | // expected-note@-2 {{requirement from conditional conformance of 'ExplicitCondAlias<NC>' (aka 'ExplicitCond<NC>') to 'Copyable'}} |
12 | 27 |
|
@@ -80,7 +95,7 @@ struct ConditionalContainment<T: ~Copyable>: ~Copyable { |
80 | 95 | var y: NC // expected-error {{stored property 'y' of 'Copyable'-conforming generic struct 'ConditionalContainment' has non-Copyable type 'NC'}} |
81 | 96 | } |
82 | 97 |
|
83 | | -extension ConditionalContainment: Copyable {} |
| 98 | +extension ConditionalContainment: Copyable where T: Copyable {} |
84 | 99 |
|
85 | 100 | func chk(_ T: RequireCopyable<ConditionalContainment<Int>>) {} |
86 | 101 |
|
@@ -126,7 +141,7 @@ enum Maybe<Wrapped: ~Copyable>: ~Copyable { |
126 | 141 | deinit {} // expected-error {{deinitializer cannot be declared in generic enum 'Maybe' that conforms to 'Copyable'}} |
127 | 142 | } |
128 | 143 |
|
129 | | -extension Maybe: Copyable {} |
| 144 | +extension Maybe: Copyable where Wrapped: Copyable {} |
130 | 145 |
|
131 | 146 | // expected-note@+4{{requirement specified as 'NC' : 'Copyable'}} |
132 | 147 | // expected-note@+3{{requirement from conditional conformance of 'Maybe<NC>' to 'Copyable'}} |
@@ -173,11 +188,11 @@ class NiceTry: ~Copyable, Copyable {} // expected-error {{classes cannot be '~Co |
173 | 188 |
|
174 | 189 |
|
175 | 190 | struct Extendo: ~Copyable {} |
176 | | -extension Extendo: Copyable, ~Copyable {} // expected-error {{cannot suppress '~Copyable' in extension}} |
| 191 | +extension Extendo: Copyable, ~Copyable {} // expected-error {{cannot suppress 'Copyable' in extension}} |
177 | 192 | // expected-error@-1 {{struct 'Extendo' required to be 'Copyable' but is marked with '~Copyable'}} |
178 | 193 |
|
179 | 194 | enum EnumExtendo {} |
180 | | -extension EnumExtendo: ~Copyable {} // expected-error {{cannot suppress '~Copyable' in extension}} |
| 195 | +extension EnumExtendo: ~Copyable {} // expected-error {{cannot suppress 'Copyable' in extension}} |
181 | 196 |
|
182 | 197 | extension NeedsCopyable where Self: ~Copyable {} |
183 | 198 | // expected-error@-1 {{'Self' required to be 'Copyable' but is marked with '~Copyable'}} |
@@ -265,7 +280,7 @@ enum MaybeEscapes<T: ~Escapable>: ~Escapable { // expected-note {{generic enum ' |
265 | 280 | case none |
266 | 281 | } |
267 | 282 |
|
268 | | -extension MaybeEscapes: Escapable {} |
| 283 | +extension MaybeEscapes: Escapable where T: Escapable {} |
269 | 284 |
|
270 | 285 | struct Escapes { // expected-note {{consider adding '~Escapable' to struct 'Escapes'}} |
271 | 286 | let t: MaybeEscapes<NonescapingType> // expected-error {{stored property 't' of 'Escapable'-conforming struct 'Escapes' has non-Escapable type 'MaybeEscapes<NonescapingType>'}} |
|
0 commit comments