-
Notifications
You must be signed in to change notification settings - Fork 10.4k
/
Copy pathinverse_conditional_conformance_copyable_and_escapable.swift
92 lines (66 loc) · 3.87 KB
/
inverse_conditional_conformance_copyable_and_escapable.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
// RUN: %target-swift-frontend \
// RUN: -enable-experimental-feature LifetimeDependence \
// RUN: -typecheck -verify %s
// REQUIRES: swift_feature_LifetimeDependence
struct C_C1<T: ~Copyable>: ~Copyable {}
extension C_C1: Copyable where T: Copyable {}
struct C_C2<T: ~Copyable>: ~Copyable {}
// expected-error @+2 {{conditional conformance to 'Copyable' must explicitly state whether 'T' is required to conform to 'Copyable'}}
// expected-error @+1 {{marked with '~Copyable'}}
extension C_C2: Copyable {}
struct C_CE1<T: ~Copyable & ~Escapable>: ~Copyable {}
extension C_CE1: Copyable where T: Copyable, T: ~Escapable {}
struct C_CE2<T: ~Copyable & ~Escapable>: ~Copyable {}
// expected-error @+1 {{conditional conformance to 'Copyable' must explicitly state whether 'T' is required to conform to 'Escapable'}}
extension C_CE2: Copyable where T: Copyable {}
struct C_CE3<T: ~Copyable & ~Escapable>: ~Copyable {}
// expected-error @+2 {{conditional conformance to 'Copyable' must explicitly state whether 'T' is required to conform to 'Copyable'}}
// expected-error @+1 {{marked with '~Copyable'}}
extension C_CE3: Copyable where T: ~Escapable {}
struct CE_C<T: ~Copyable>: ~Copyable, ~Escapable {}
extension CE_C: Copyable where T: Copyable {}
struct CE_E<T: ~Escapable>: ~Copyable, ~Escapable {}
extension CE_E: Escapable where T: Escapable {}
struct CE_CE1<T: ~Copyable & ~Escapable>: ~Copyable, ~Escapable {}
extension CE_CE1: Copyable where T: Copyable, T: ~Escapable {}
extension CE_CE1: Escapable where T: ~Copyable, T: Escapable {}
struct CE_CE2<T: ~Copyable & ~Escapable>: ~Copyable, ~Escapable {}
// expected-error @+1 {{conditional conformance to 'Copyable' must explicitly state whether 'T' is required to conform to 'Escapable'}}
extension CE_CE2: Copyable where T: Copyable {}
// expected-error @+1 {{conditional conformance to 'Escapable' must explicitly state whether 'T' is required to conform to 'Copyable'}}
extension CE_CE2: Escapable where T: Escapable {}
struct CE_CE3<T: ~Copyable & ~Escapable>: ~Copyable, ~Escapable {}
// expected-error @+2 {{conditional conformance to 'Copyable' must explicitly state whether 'T' is required to conform to 'Copyable'}}
// expected-error @+1 {{marked with '~Copyable'}}
extension CE_CE3: Copyable where T: ~Escapable {}
// expected-error @+2 {{conditional conformance to 'Escapable' must explicitly state whether 'T' is required to conform to 'Escapable'}}
// expected-error @+1 {{marked with '~Escapable'}}
extension CE_CE3: Escapable where T: ~Copyable {}
struct C_C_X<T: ~Copyable, U>: ~Copyable {}
extension C_C_X: Copyable where T: Copyable {}
protocol Floppyable {} // implied Copyable requirement
struct C_C_P<T: ~Copyable, U: Floppyable>: ~Copyable {}
extension C_C_P: Copyable where T: Copyable {}
class Sloppyable {} // implied Copyable requirement since it's a class
struct C_C_K<T: ~Copyable, U: Sloppyable>: ~Copyable {}
extension C_C_K: Copyable where T: Copyable {}
protocol Ploppyable: ~Copyable {}
struct C_C_PC1<T: ~Copyable, U: Ploppyable & ~Copyable>: ~Copyable {}
// expected-error @+1 {{conditional conformance to 'Copyable' must explicitly state whether 'U' is required to conform to 'Copyable'}}
extension C_C_PC1: Copyable where T: Copyable {}
struct C_C_PC2<T: ~Copyable, U: Ploppyable & ~Copyable>: ~Copyable {}
extension C_C_PC2: Copyable where T: Copyable, U: Copyable {}
struct C_C_X2<T: ~Copyable, U: Ploppyable /*& Copyable*/>: ~Copyable {}
extension C_C_X2: Copyable where T: Copyable {}
struct C_C_L<T: ~Copyable, U: AnyObject>: ~Copyable {}
extension C_C_L: Copyable where T: Copyable {}
struct C_C_C<T: ~Copyable, U: ~Copyable> {}
extension C_C_C where T: ~Copyable, U == Int {
struct SubInt: ~Copyable {}
}
extension C_C_C.SubInt: Copyable where T: Copyable {}
struct NC: ~Copyable {}
extension C_C_C where T: ~Copyable, U: ~Copyable, U == NC {
struct SubNC: ~Copyable {}
}
extension C_C_C.SubNC: Copyable where T: Copyable {}