Files
swift-mirror/test/Interpreter/moveonly_escaping_definite_initialization.swift
Kavon Farvardin 0420310623 NCGenerics: it's no longer "experimental"
resolves rdar://127701059
2024-05-08 10:49:12 -07:00

73 lines
1.2 KiB
Swift

// RUN: %target-run-simple-swift | %FileCheck %s
// RUN: %target-run-simple-swift(-O -Xfrontend -sil-verify-all) | %FileCheck %s
// REQUIRES: executable_test
@_moveOnly
struct MO {
var value: Int
func use() {}
deinit { print("destroying \(value)") }
}
var closure: () -> () = {}
var counter = 42
func foo(goUp: Bool) {
let mo: MO
if goUp {
counter += 1
mo = MO(value: counter)
} else {
counter -= 1
mo = MO(value: counter)
}
mo.use()
closure = { print("captured \(mo.value)") }
}
// CHECK: starting
print("starting")
// CHECK-NEXT: captured 43
foo(goUp: true)
closure()
// CHECK-NEXT: destroying 43
// CHECK-NEXT: captured 44
foo(goUp: true)
closure()
// CHECK-NEXT: destroying 44
// CHECK-NEXT: captured 43
foo(goUp: false)
closure()
// CHECK-NEXT: destroying 43
closure = {}
// CHECK-NEXT: starting bar
print("starting bar")
func bar() {
var y: MO
y = MO(value: 17)
// CHECK-NEXT: destroying 17
y = MO(value: 38)
closure = { y = MO(value: 679) }
y.use()
}
bar()
// CHECK-NEXT: destroying 38
closure()
// CHECK-NEXT: done with bar
print("done with bar")
// CHECK-NEXT: destroying 679
closure = {}
// CHECK-NEXT: done
print("done")