1
- // RUN: %target-swift-frontend -emit-silgen -enable-experimental-feature NoncopyableGenerics -disable-availability-checking -module-name main %s | %FileCheck %s
1
+ // RUN: %target-swift-frontend -emit-silgen -enable-experimental-feature NoncopyableGenerics -enable-experimental-feature NonescapableTypes - disable-availability-checking -module-name main %s | %FileCheck %s
2
2
3
3
protocol NoCopyP : ~ Copyable { }
4
4
@@ -24,7 +24,31 @@ enum CondCopyableEnum<T: ~Copyable>: ~Copyable {
24
24
25
25
extension CondCopyableEnum : Copyable { }
26
26
27
- // MARK: ensure certain types are treated as trivial (no ownership in func signature).
27
+ protocol NoEscapeP : ~ Escapable { }
28
+
29
+ struct NE: ~ Escapable { }
30
+
31
+ struct TooRudeStruct < T: ~ Escapable> : Escapable {
32
+ let thing : Int
33
+ }
34
+
35
+ enum TooRudeEnum < T: ~ Escapable> : Escapable {
36
+ case holder( Int )
37
+ case whatever
38
+ }
39
+
40
+ struct CondEscapableStruct < T: ~ Escapable> : ~ Escapable { }
41
+
42
+ extension CondEscapableStruct : Escapable { }
43
+
44
+ enum CondEscapableEnum < T: ~ Escapable> : ~ Escapable {
45
+ case some( T )
46
+ case none
47
+ }
48
+
49
+ extension CondEscapableEnum : Escapable { }
50
+
51
+ // MARK: ensure certain conditionally Copyable types are treated as trivial (no ownership in func signature).
28
52
29
53
// CHECK: sil hidden [ossa] @$s4main5checkyyAA10RudeStructVySiGF : $@convention(thin) (RudeStruct<Int>) -> () {
30
54
func check( _ t: RudeStruct < Int > ) { }
@@ -68,18 +92,68 @@ func check(_ t: consuming any NoCopyP & ~Copyable) {}
68
92
// CHECK: sil hidden [ossa] @$s4main5checkyyAA7NoCopyP_pRi_s_XPzF : $@convention(thin) (@inout any NoCopyP & ~Copyable) -> () {
69
93
func check( _ t: inout any NoCopyP & ~ Copyable) { }
70
94
71
- struct MyStruct < T: ~ Copyable> : ~ Copyable {
95
+ // MARK: ensure certain conditionally Escapable types are treated as trivial (no ownership in func signature).
96
+
97
+ // CHECK: sil hidden [ossa] @$s4main5checkyyAA13TooRudeStructVySiGF : $@convention(thin) (TooRudeStruct<Int>) -> () {
98
+ func check( _ t: TooRudeStruct < Int > ) { }
99
+
100
+ // CHECK: sil hidden [ossa] @$s4main5checkyyAA13TooRudeStructVyAA2NEVGF : $@convention(thin) (TooRudeStruct<NE>) -> () {
101
+ func check( _ t: TooRudeStruct < NE > ) { }
102
+
103
+ // CHECK: sil hidden [ossa] @$s4main5checkyyAA11TooRudeEnumOySiGF : $@convention(thin) (TooRudeEnum<Int>) -> () {
104
+ func check( _ t: TooRudeEnum < Int > ) { }
105
+
106
+ // CHECK: sil hidden [ossa] @$s4main5checkyyAA11TooRudeEnumOyAA2NEVGF : $@convention(thin) (TooRudeEnum<NE>) -> () {
107
+ func check( _ t: TooRudeEnum < NE > ) { }
108
+
109
+ // CHECK: sil hidden [ossa] @$s4main5checkyyAA19CondEscapableStructVySiGF : $@convention(thin) (CondEscapableStruct<Int>) -> () {
110
+ func check( _ t: CondEscapableStruct < Int > ) { }
111
+
112
+ // CHECK: sil hidden [ossa] @$s4main5checkyyAA19CondEscapableStructVyAA2NEVGF : $@convention(thin) (@guaranteed CondEscapableStruct<NE>) -> () {
113
+ func check( _ t: borrowing CondEscapableStruct < NE > ) { }
114
+
115
+ // CHECK: sil hidden [ossa] @$s4main5checkyyAA17CondEscapableEnumOySiGF : $@convention(thin) (CondEscapableEnum<Int>) -> () {
116
+ func check( _ t: CondEscapableEnum < Int > ) { }
117
+
118
+ // CHECK: sil hidden [ossa] @$s4main5checkyyAA17CondEscapableEnumOyAA2NEVGF : $@convention(thin) (@guaranteed CondEscapableEnum<NE>) -> () {
119
+ func check( _ t: borrowing CondEscapableEnum < NE > ) { }
120
+
121
+ // CHECK: sil hidden [ossa] @$s4main5checkyyAA17CondEscapableEnumOyxGlF : $@convention(thin) <T> (@in_guaranteed CondEscapableEnum<T>) -> () {
122
+ func check< T> ( _ t: CondEscapableEnum < T > ) { }
123
+
124
+ // CHECK: sil hidden [ossa] @$s4main5checkyyAA17CondEscapableEnumOyxGRi0_zlF : $@convention(thin) <U where U : ~Escapable> (@in_guaranteed CondEscapableEnum<U>) -> () {
125
+ func check< U: ~ Escapable> ( _ t: borrowing CondEscapableEnum < U > ) { }
126
+
127
+ // CHECK: sil hidden [ossa] @$s4main5checkyyAA9NoEscapeP_pF : $@convention(thin) (@in_guaranteed any NoEscapeP) -> () {
128
+ func check( _ t: any NoEscapeP ) { }
129
+
130
+ // CHECK: sil hidden [ossa] @$s4main5checkyyAA9NoEscapeP_pRi0_s_XPF : $@convention(thin) (@in_guaranteed any NoEscapeP & ~Escapable) -> () {
131
+ func check( _ t: borrowing any NoEscapeP & ~ Escapable) { }
132
+
133
+ // CHECK: sil hidden [ossa] @$s4main5checkyyAA9NoEscapeP_pRi0_s_XPnF : $@convention(thin) (@in any NoEscapeP & ~Escapable) -> () {
134
+ func check( _ t: consuming any NoEscapeP & ~ Escapable) { }
135
+
136
+ // CHECK: sil hidden [ossa] @$s4main5checkyyAA9NoEscapeP_pRi0_s_XPzF : $@convention(thin) (@inout any NoEscapeP & ~Escapable) -> () {
137
+ func check( _ t: inout any NoEscapeP & ~ Escapable) { }
138
+
139
+ // MARK: conditionally Copyable & Escapable SILGen
140
+
141
+ struct MyStruct< T : ~ Copyable & ~ Escapable> : ~ Copyable & ~ Escapable {
72
142
var x : T
73
143
}
74
144
75
- extension MyStruct : Copyable where T: Copyable { }
145
+ extension MyStruct : Copyable where T: Copyable & ~ Escapable { }
76
146
77
- enum MyEnum < T: ~ Copyable> : ~ Copyable {
147
+ extension MyStruct : Escapable where T: Escapable & ~ Copyable { }
148
+
149
+ enum MyEnum< T : ~ Copyable & ~ Escapable> : ~ Copyable & ~ Escapable {
78
150
case x( T)
79
151
case knoll
80
152
}
81
153
82
- extension MyEnum : Copyable where T: Copyable { }
154
+ extension MyEnum : Copyable where T: Copyable & ~ Escapable { }
155
+
156
+ extension MyEnum : Escapable where T: Escapable & ~ Copyable { }
83
157
84
158
enum Trivial {
85
159
case a, b, c
0 commit comments