Skip to content

Commit 8ced252

Browse files
committed
[move-only] Add some tests that validate that we handle accessing grand fields of an address only move only type correctly.
1 parent 483dfca commit 8ced252

File tree

1 file changed

+86
-0
lines changed

1 file changed

+86
-0
lines changed

test/SILOptimizer/moveonly_addresschecker_diagnostics.swift

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ public final class CopyableKlassWithMoveOnlyField {
8989

9090
public protocol P {
9191
static var value: Self { get }
92+
var name: CopyableKlass { get }
9293
static var value2: any P { get }
9394
}
9495

@@ -110,6 +111,7 @@ public struct AddressOnlyGeneric<T : P> {
110111
extension CopyableKlass : P {
111112
public static var value: Self { fatalError() }
112113
public static var value2: any P { CopyableKlass() }
114+
public var name: CopyableKlass { CopyableKlass() }
113115
}
114116

115117
@_moveOnly
@@ -2359,6 +2361,39 @@ public func addressOnlyGenericAccessConsumeField2<T>(_ x: borrowing AddressOnlyG
23592361
}
23602362
}
23612363

2364+
public func addressOnlyGenericAccessConsumeGrandField<T>(_ x: borrowing AddressOnlyGeneric<T>) { // expected-error {{'x' has guaranteed ownership but was consumed}}
2365+
var x2 = x // expected-note {{consuming use here}}
2366+
x2 = AddressOnlyGeneric<T>()
2367+
2368+
consumeVal(x2.copyable.name)
2369+
for _ in 0..<1024 {
2370+
consumeVal(x2.copyable.name)
2371+
}
2372+
}
2373+
2374+
public func addressOnlyGenericAccessConsumeGrandField2<T>(_ x: borrowing AddressOnlyGeneric<T>) { // expected-error {{'x' has guaranteed ownership but was consumed}}
2375+
var x2 = x // expected-note {{consuming use here}}
2376+
// expected-error @-1 {{'x2' consumed more than once}}
2377+
// expected-error @-2 {{'x2' consumed by a use in a loop}}
2378+
x2 = AddressOnlyGeneric<T>()
2379+
2380+
consumeVal(x2.moveOnly.k) // expected-note {{consuming use here}}
2381+
for _ in 0..<1024 {
2382+
consumeVal(x2.moveOnly.k) // expected-note {{consuming use here}}
2383+
// expected-note @-1 {{consuming use here}}
2384+
}
2385+
}
2386+
2387+
public func addressOnlyGenericAccessConsumeGrandField2a<T>(_ x: borrowing AddressOnlyGeneric<T>) { // expected-error {{'x' has guaranteed ownership but was consumed}}
2388+
var x2 = x // expected-note {{consuming use here}}
2389+
x2 = AddressOnlyGeneric<T>()
2390+
2391+
consumeVal(x2.moveOnly.copyableK)
2392+
for _ in 0..<1024 {
2393+
consumeVal(x2.moveOnly.copyableK)
2394+
}
2395+
}
2396+
23622397
public func addressOnlyGenericAccessConsumeFieldArg<T>(_ x2: inout AddressOnlyGeneric<T>) {
23632398
consumeVal(x2.copyable)
23642399
for _ in 0..<1024 {
@@ -2395,6 +2430,57 @@ public func addressOnlyGenericAccessConsumeFieldArg4<T>(_ x2: consuming AddressO
23952430
}
23962431
}
23972432

2433+
public func addressOnlyGenericAccessConsumeGrandFieldArg<T>(_ x2: inout AddressOnlyGeneric<T>) {
2434+
consumeVal(x2.copyable.name)
2435+
for _ in 0..<1024 {
2436+
consumeVal(x2.copyable.name)
2437+
}
2438+
}
2439+
2440+
public func addressOnlyGenericAccessConsumeGrandFieldArg2<T>(_ x2: inout AddressOnlyGeneric<T>) {
2441+
// expected-error @-1 {{'x2' consumed but not reinitialized before end of function}}
2442+
// expected-error @-2 {{'x2' consumed but not reinitialized before end of function}}
2443+
consumeVal(x2.moveOnly.k) // expected-note {{consuming use here}}
2444+
2445+
for _ in 0..<1024 {
2446+
consumeVal(x2.moveOnly.k) // expected-note {{consuming use here}}
2447+
}
2448+
}
2449+
2450+
public func addressOnlyGenericAccessConsumeGrandFieldArg2a<T>(_ x2: inout AddressOnlyGeneric<T>) {
2451+
consumeVal(x2.moveOnly.copyableK)
2452+
2453+
for _ in 0..<1024 {
2454+
consumeVal(x2.moveOnly.copyableK)
2455+
}
2456+
}
2457+
2458+
public func addressOnlyGenericAccessConsumeGrandFieldArg3<T>(_ x2: consuming AddressOnlyGeneric<T>) {
2459+
consumeVal(x2.copyable.name)
2460+
2461+
for _ in 0..<1024 {
2462+
consumeVal(x2.copyable.name)
2463+
}
2464+
}
2465+
2466+
public func addressOnlyGenericAccessConsumeGrandFieldArg4<T>(_ x2: consuming AddressOnlyGeneric<T>) {
2467+
// expected-error @-1 {{'x2' consumed by a use in a loop}}
2468+
// expected-error @-2 {{'x2' consumed more than once}}
2469+
consumeVal(x2.moveOnly.k) // expected-note {{consuming use here}}
2470+
2471+
for _ in 0..<1024 {
2472+
consumeVal(x2.moveOnly.k) // expected-note {{consuming use here}}
2473+
// expected-note @-1 {{consuming use here}}
2474+
}
2475+
}
2476+
2477+
public func addressOnlyGenericAccessConsumeGrandFieldArg4a<T>(_ x2: consuming AddressOnlyGeneric<T>) {
2478+
consumeVal(x2.moveOnly.copyableK)
2479+
2480+
for _ in 0..<1024 {
2481+
consumeVal(x2.moveOnly.copyableK)
2482+
}
2483+
}
23982484

23992485
extension AddressOnlyGeneric {
24002486
func testNoUseSelf() { // expected-error {{'self' has guaranteed ownership but was consumed}}

0 commit comments

Comments
 (0)