Files
swift-mirror/test/Interop/C/struct/noncopyable_structs.swift

82 lines
4.3 KiB
Swift

// Check that we get the expected errors for incorrect uses of noncopyable
// imported types with both C and C++ interoperability.
// RUN: %target-swift-frontend -emit-sil -I %S/Inputs/ -I %swift_src_root/lib/ClangImporter/SwiftBridging %s -verify -DERRORS -verify-additional-prefix conly-
// RUN: %target-swift-frontend -emit-sil -I %S/Inputs/ -I %swift_src_root/lib/ClangImporter/SwiftBridging %s -verify -DERRORS -DCPLUSPLUS -verify-additional-prefix cplusplus- -cxx-interoperability-mode=default
// Check that we get the expected SIL
// RUN: %target-swift-frontend -emit-sil -I %S/Inputs/ -I %swift_src_root/lib/ClangImporter/SwiftBridging %s -o - | %FileCheck -check-prefix CHECK-SIL %s
// RUN: %target-swift-frontend -emit-sil -I %S/Inputs/ -I %swift_src_root/lib/ClangImporter/SwiftBridging %s -o - -cxx-interoperability-mode=default| %FileCheck -check-prefix CHECK-SIL %s
// Check that we get the expected IR
// RUN: %target-swift-frontend -emit-ir -I %S/Inputs/ -I %swift_src_root/lib/ClangImporter/SwiftBridging %s -o - | %FileCheck -check-prefix CHECK-IR %s
// RUN: %target-swift-frontend -emit-ir -I %S/Inputs/ -I %swift_src_root/lib/ClangImporter/SwiftBridging %s -o - -cxx-interoperability-mode=default | %FileCheck -check-prefix CHECK-IR %s
import NoncopyableStructs
// CHECK-IR-LABEL: define hidden swiftcc void @"$s19noncopyable_structs9consumeNCyySo11NonCopyableVnF"(float %0, float %1) #0 {
// CHECK-IR: call ptr @"$sSo11NonCopyableVWOh"
// CHECK-IR: define linkonce_odr hidden ptr @"$sSo11NonCopyableVWOh"(ptr %0)
// CHECK-IR-NEXT: entry:
// CHECK-IR-NEXT: ret ptr
func consumeNC(_ nc: consuming NonCopyable) { }
func testNC() {
let nc = NonCopyable() // expected-error{{'nc' consumed more than once}}
consumeNC(nc) // expected-note{{consumed here}}
let ncAPI = NonCopyableWithAPINotesDeinit() // expected-error{{consumed more than once}}
consumeNCAPI(ncAPI) // expected-note{{consumed here}}
#if ERRORS
consumeNC(nc) // expected-note{{consumed again here}}
consumeNCAPI(ncAPI) // expected-note{{consumed again here}}
#endif
}
func consumeNCAPI(_ nc: consuming NonCopyableWithAPINotesDeinit) { }
func consumeNCWithDeinit(_ nc: consuming NonCopyableWithDeinit) { }
func testNCWithDeinit() {
let nc = NonCopyableWithDeinit() // expected-error{{'nc' consumed more than once}}
consumeNCWithDeinit(nc) // expected-note{{consumed here}}
#if ERRORS
consumeNCWithDeinit(nc) // expected-note{{consumed again here}}
#endif
}
#if ERRORS
// expected-warning@+1{{destroy operation 'freeCopyableType' is only allowed on non-copyable types; did you mean to use SWIFT_NONCOPYABLE?}}
func copyableType(_: CopyableType) { }
// expected-warning@+1{{'MultiNonCopyableType' is deprecated: multiple destroy operations ('freeMultiNonCopyable1' and 'freeMultiNonCopyable2') provided for type}}
func multiNonCopyableType(_: borrowing MultiNonCopyableType) { }
// expected-warning@+1{{'BadDestroyNonCopyableType' is deprecated: destroy function 'badDestroy1' must have a single parameter with type 'BadDestroyNonCopyableType'}}
func bad1(_: borrowing BadDestroyNonCopyableType) { }
// expected-warning@+1{{'BadDestroyNonCopyableType2' is deprecated: destroy function 'badDestroy2' must have a single parameter with type 'BadDestroyNonCopyableType2'}}
func bad2(_: borrowing BadDestroyNonCopyableType2) { }
#endif
// CHECK-SIL: sil shared @$sSo21NonCopyableWithDeinitVfD : $@convention(method) (@owned NonCopyableWithDeinit) -> () {
// CHECK-SIL: bb0([[SELF:%[0-9]+]] : $NonCopyableWithDeinit):
// CHECK-SIL: [[SELF_ALLOC:%[0-9]+]] = alloc_stack $NonCopyableWithDeinit
// CHECK-SIL: store [[SELF]] to [[SELF_ALLOC]]
// CHECK-SIL: [[SELF_RELOAD:%[0-9]+]] = load [[SELF_ALLOC]]
// CHECK-SIL: [[FN:%[0-9]+]] = function_ref @{{.*}}freeNonCopyableWithDeinit{{.*}} : $@convention(c) (NonCopyableWithDeinit) -> ()
// CHECK-SIL: apply [[FN]]([[SELF_RELOAD]]) : $@convention(c) (NonCopyableWithDeinit) -> ()
// CHECK-IR-LABEL: define hidden swiftcc void @"$s19noncopyable_structs19consumeNCWithDeinityySo015NonCopyableWithE0VnF"
// CHECK-IR: call swiftcc void @"$sSo21NonCopyableWithDeinitVfD"
// CHECK-IR-LABEL: define {{.*}} swiftcc void @"$sSo21NonCopyableWithDeinitVfD"
// CHECK-IR: {{(call|invoke)}} void @{{.*}}freeNonCopyableWithDeinit
// CHECK-SIL-LABEL: sil_moveonlydeinit NonCopyableWithDeinit {
// CHECK-SIL: @$sSo21NonCopyableWithDeinitVfD