// RUN: %target-run-simple-swift | %FileCheck %s // REQUIRES: executable_test struct EmptyWithDeinit: ~Copyable { deinit { print("destroying empty") } } struct EmptyWithDeinitGeneric: ~Copyable { deinit { print("destroying \(T.self) empty") } } struct EmptyWithDeinitGenericIndirect: ~Copyable { let value = EmptyWithDeinitGeneric() } struct FixedWithDeinit: ~Copyable { var field = 0 deinit { print("destroying fixed") } } struct FixedWithDeinitGeneric: ~Copyable { var field = 0 deinit { print("destroying \(T.self) fixed") } } struct FixedWithDeinitGenericIndirect: ~Copyable { let value = FixedWithDeinitGeneric() } @inline(never) func borrow(_: borrowing T) {} @inline(never) func capture_and_release() -> () -> () { let ewd = EmptyWithDeinit() return { borrow(ewd) } } @inline(never) func capture_and_release_generic(_: T.Type) -> () -> () { let ewd = EmptyWithDeinitGeneric() return { borrow(ewd) } } @inline(never) func capture_and_release_generic_indirect(_: T.Type) -> () -> () { let ewd = EmptyWithDeinitGeneric() return { borrow(ewd) } } @inline(never) func capture_and_release_fixed() -> () -> () { let ewd = FixedWithDeinit() return { borrow(ewd) } } @inline(never) func capture_and_release_generic_fixed(_: T.Type) -> () -> () { let ewd = FixedWithDeinitGeneric() return { borrow(ewd) } } @inline(never) func capture_and_release_generic_indirect_fixed(_: T.Type) -> () -> () { let ewd = FixedWithDeinitGeneric() return { borrow(ewd) } } func main() { // CHECK: starting print("starting") do { // CHECK-NEXT: destroying empty _ = capture_and_release() } do { // CHECK-NEXT: destroying Int empty _ = capture_and_release_generic(Int.self) } do { // CHECK-NEXT: destroying String empty _ = capture_and_release_generic_indirect(String.self) } do { // CHECK-NEXT: destroying fixed _ = capture_and_release_fixed() } do { // CHECK-NEXT: destroying Float fixed _ = capture_and_release_generic_fixed(Float.self) } do { // CHECK-NEXT: destroying Double fixed _ = capture_and_release_generic_indirect_fixed(Double.self) } } main()