mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
50 lines
1.1 KiB
Swift
50 lines
1.1 KiB
Swift
// RUN: %target-run-simple-swift | %FileCheck %s
|
|
// REQUIRES: executable_test
|
|
// TODO: SIL optimizations cause a miscompile of deinit rdar://105798769
|
|
// REQUIRES: swift_test_mode_optimize_none
|
|
|
|
class C {
|
|
var value: Int
|
|
init(value: Int) { self.value = value }
|
|
|
|
deinit { print("C died \(value)") }
|
|
}
|
|
|
|
struct Butt: ~Copyable {
|
|
static var myButt: () -> () = {}
|
|
|
|
init(value: Int) { self._value = C(value: value) }
|
|
|
|
// TODO: work around crash when move-only type has a deinit and no
|
|
// nontrivial fields by putting a class here
|
|
|
|
// TODO: work around crash when we export a setter from a move-only type
|
|
// by making this stored property private
|
|
private var _value: C
|
|
|
|
var value: Int { return _value.value }
|
|
|
|
deinit { print("Butt died \(value)") }
|
|
}
|
|
|
|
func foo() {
|
|
let butt = Butt(value: 42)
|
|
|
|
Butt.myButt = { print(butt.value) }
|
|
}
|
|
|
|
func bar() {
|
|
// CHECK: 42
|
|
Butt.myButt()
|
|
// CHECK-NEXT: done calling
|
|
print("done calling")
|
|
// CHECK-NEXT: Butt died 42
|
|
// CHECK-NEXT: C died 42
|
|
Butt.myButt = {}
|
|
// CHECK-NEXT: done replacing closure
|
|
print("done replacing closure")
|
|
}
|
|
|
|
foo()
|
|
bar()
|