@@ -6,6 +6,10 @@ public class Klass {
6
6
var k : Klass ? = nil
7
7
}
8
8
9
+ public final class FinalKlass {
10
+ var k : Klass ? = nil
11
+ }
12
+
9
13
var boolValue : Bool { return true }
10
14
11
15
public func classUseMoveOnlyWithoutEscaping( _ x: Klass ) {
@@ -119,6 +123,122 @@ public func classAccessField(_ x: Klass) {
119
123
}
120
124
}
121
125
126
+ /////////////////
127
+ // Final Class //
128
+ /////////////////
129
+
130
+ public func finalClassUseMoveOnlyWithoutEscaping( _ x: FinalKlass ) {
131
+ }
132
+ public func finalClassConsume( _ x: __owned FinalKlass) {
133
+ }
134
+
135
+ public func finalClassSimpleChainTest( _ x: FinalKlass ) {
136
+ @_noImplicitCopy let x2 = x
137
+ let y2 = x2
138
+ let k2 = y2
139
+ finalClassUseMoveOnlyWithoutEscaping ( k2)
140
+ }
141
+
142
+ public func finalClassSimpleNonConsumingUseTest( _ x: FinalKlass ) {
143
+ @_noImplicitCopy let x2 = x
144
+ finalClassUseMoveOnlyWithoutEscaping ( x2)
145
+ }
146
+
147
+ public func finalClassMultipleNonConsumingUseTest( _ x: FinalKlass ) {
148
+ @_noImplicitCopy let x2 = x
149
+ finalClassUseMoveOnlyWithoutEscaping ( x2)
150
+ finalClassUseMoveOnlyWithoutEscaping ( x2)
151
+ print ( x2)
152
+ }
153
+
154
+ public func finalClassUseAfterConsume( _ x: FinalKlass ) {
155
+ @_noImplicitCopy let x2 = x // expected-error {{'x2' consumed more than once}}
156
+ finalClassUseMoveOnlyWithoutEscaping ( x2)
157
+ finalClassConsume ( x2) // expected-note {{consuming use}}
158
+ print ( x2) // expected-note {{consuming use}}
159
+ }
160
+
161
+ public func finalClassDoubleConsume( _ x: FinalKlass ) {
162
+ @_noImplicitCopy let x2 = x // expected-error {{'x2' consumed more than once}}
163
+ finalClassConsume ( x2) // expected-note {{consuming use}}
164
+ finalClassConsume ( x2) // expected-note {{consuming use}}
165
+ }
166
+
167
+ public func finalClassLoopConsume( _ x: FinalKlass ) {
168
+ @_noImplicitCopy let x2 = x // expected-error {{'x2' consumed more than once}}
169
+ for _ in 0 ..< 1024 {
170
+ finalClassConsume ( x2) // expected-note {{consuming use}}
171
+ }
172
+ }
173
+
174
+ public func finalClassDiamond( _ x: FinalKlass ) {
175
+ @_noImplicitCopy let x2 = x
176
+ if boolValue {
177
+ finalClassConsume ( x2)
178
+ } else {
179
+ finalClassConsume ( x2)
180
+ }
181
+ }
182
+
183
+ public func finalClassDiamondInLoop( _ x: FinalKlass ) {
184
+ @_noImplicitCopy let x2 = x // expected-error {{'x2' consumed more than once}}
185
+ for _ in 0 ..< 1024 {
186
+ if boolValue {
187
+ finalClassConsume ( x2) // expected-note {{consuming use}}
188
+ } else {
189
+ finalClassConsume ( x2) // expected-note {{consuming use}}
190
+ }
191
+ }
192
+ }
193
+
194
+ public func finalClassAssignToVar1( _ x: FinalKlass ) {
195
+ @_noImplicitCopy let x2 = x // expected-error {{'x2' consumed more than once}}
196
+ var x3 = x2 // expected-note {{consuming use}}
197
+ x3 = x2 // expected-note {{consuming use}}
198
+ x3 = x
199
+ print ( x3)
200
+ }
201
+
202
+ public func finalClassAssignToVar2( _ x: FinalKlass ) {
203
+ @_noImplicitCopy let x2 = x // expected-error {{'x2' consumed more than once}}
204
+ var x3 = x2 // expected-note {{consuming use}}
205
+ x3 = x2 // expected-note {{consuming use}}
206
+ finalClassUseMoveOnlyWithoutEscaping ( x3)
207
+ }
208
+
209
+ public func finalClassAssignToVar3( _ x: FinalKlass ) {
210
+ @_noImplicitCopy let x2 = x
211
+ var x3 = x2
212
+ x3 = x
213
+ print ( x3)
214
+ }
215
+
216
+ public func finalClassAssignToVar4( _ x: FinalKlass ) {
217
+ @_noImplicitCopy let x2 = x // expected-error {{'x2' consumed more than once}}
218
+ let x3 = x2 // expected-note {{consuming use}}
219
+ print ( x2) // expected-note {{consuming use}}
220
+ print ( x3)
221
+ }
222
+
223
+ public func finalClassAssignToVar5( _ x: FinalKlass ) {
224
+ @_noImplicitCopy let x2 = x // expected-error {{'x2' consumed more than once}}
225
+ var x3 = x2 // expected-note {{consuming use}}
226
+ // TODO: Need to mark this as the lifetime extending use. We fail
227
+ // appropriately though.
228
+ finalClassUseMoveOnlyWithoutEscaping ( x2)
229
+ x3 = x
230
+ print ( x3)
231
+ }
232
+
233
+ public func finalClassAccessField( _ x: FinalKlass ) {
234
+ @_noImplicitCopy let x2 = x
235
+ print ( x2. k!)
236
+ for _ in 0 ..< 1024 {
237
+ print ( x2. k!)
238
+ }
239
+ }
240
+
241
+
122
242
//////////////////////
123
243
// Aggregate Struct //
124
244
//////////////////////
0 commit comments