Skip to content

Commit 6b813b5

Browse files
committed
[no-implicit-copy] Add diagnostic tests for final classes.
Just added code coverage.
1 parent b6a4923 commit 6b813b5

File tree

1 file changed

+120
-0
lines changed

1 file changed

+120
-0
lines changed

test/SILOptimizer/move_only_checker.swift

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
913
var boolValue: Bool { return true }
1014

1115
public 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

Comments
 (0)