@@ -6,6 +6,10 @@ public class Klass {
66 var k : Klass ? = nil
77}
88
9+ public final class FinalKlass {
10+ var k : Klass ? = nil
11+ }
12+
913var boolValue : Bool { return true }
1014
1115public func classUseMoveOnlyWithoutEscaping( _ x: Klass ) {
@@ -119,6 +123,122 @@ public func classAccessField(_ x: Klass) {
119123 }
120124}
121125
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+
122242//////////////////////
123243// Aggregate Struct //
124244//////////////////////
0 commit comments