mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
This is a value operation that can work just fine on lowered types, so there's no need to carry along a formal type. Make the value/address duality clearer, and enforce it in the verifier.
83 lines
2.7 KiB
Swift
83 lines
2.7 KiB
Swift
// RUN: %target-swift-frontend -enable-experimental-feature BuiltinModule -enable-experimental-feature RawLayout -Xllvm -sil-print-types -emit-sil %s | %FileCheck %s
|
|
|
|
// REQUIRES: swift_feature_BuiltinModule
|
|
// REQUIRES: swift_feature_RawLayout
|
|
|
|
import Builtin
|
|
|
|
@_silgen_name("init_lock")
|
|
func init_lock(_: Builtin.RawPointer)
|
|
|
|
@_silgen_name("deinit_lock")
|
|
func deinit_lock(_: Builtin.RawPointer)
|
|
|
|
@_rawLayout(size: 4, alignment: 4)
|
|
struct Lock: ~Copyable {
|
|
var _address: Builtin.RawPointer { return Builtin.addressOfBorrow(self) }
|
|
|
|
// CHECK-LABEL: // Lock.init()
|
|
// CHECK-NEXT: Isolation: unspecified
|
|
// CHECK-NEXT: sil{{.*}} @[[INIT:\$.*4LockV.*fC]] :
|
|
init() {
|
|
// CHECK-NOT: destroy_addr
|
|
// CHECK: builtin "zeroInitializer"({{%.*}} : $*Lock)
|
|
// CHECK-NOT: destroy_addr
|
|
// CHECK: [[F:%.*]] = function_ref @init_lock
|
|
// CHECK: apply [[F]](
|
|
// CHECK-NOT: destroy_addr
|
|
// CHECK: } // end sil function '[[INIT]]'
|
|
init_lock(_address)
|
|
}
|
|
|
|
// CHECK-LABEL: // Lock.deinit
|
|
// CHECK-NEXT: // Isolation: nonisolated
|
|
// CHECK-NEXT: sil{{.*}} @[[DEINIT:\$.*4LockV.*fD]] :
|
|
deinit {
|
|
// CHECK-NOT: destroy_addr
|
|
// CHECK: [[F:%.*]] = function_ref @deinit_lock
|
|
// CHECK: apply [[F]](
|
|
// CHECK-NOT: destroy_addr
|
|
// CHECK: } // end sil function '[[DEINIT]]'
|
|
deinit_lock(_address)
|
|
}
|
|
}
|
|
|
|
@_silgen_name("borrow_lock")
|
|
func borrow_lock(_: borrowing Lock)
|
|
|
|
// CHECK-LABEL: sil{{.*}} @{{.*}}7useLock
|
|
public func useLock() {
|
|
// CHECK: [[L:%.*]] = alloc_stack
|
|
// CHECK-NOT: destroy_addr [[L]] :
|
|
// CHECK: [[F:%.*]] = function_ref @[[INIT]]
|
|
// CHECK: apply [[F]]([[L]],
|
|
var l = Lock()
|
|
// CHECK-NOT: destroy_addr [[L]] :
|
|
// CHECK: [[L_BORROW:%.*]] = begin_access [read] [static] [[L]] :
|
|
// CHECK: [[F:%.*]] = function_ref @borrow_lock
|
|
// CHECK: apply [[F]]([[L_BORROW]])
|
|
// CHECK: end_access [[L_BORROW]]
|
|
borrow_lock(l)
|
|
|
|
// CHECK: [[L2:%.*]] = alloc_stack
|
|
// CHECK-NOT: destroy_addr [[L2]] :
|
|
// CHECK: [[F:%.*]] = function_ref @[[INIT]]
|
|
// CHECK: apply [[F]]([[L2]],
|
|
// CHECK: [[L_INOUT:%.*]] = begin_access [modify] [static] [[L]] :
|
|
// CHECK: destroy_addr [[L]] :
|
|
// CHECK: copy_addr [take] [[L2]] to [init] [[L_INOUT]]
|
|
// CHECK: end_access [[L_INOUT]]
|
|
// CHECK-NOT: destroy_addr [[L2]] :
|
|
// CHECK: dealloc_stack [[L2]]
|
|
l = Lock()
|
|
// CHECK-NOT: destroy_addr [[L]] :
|
|
// CHECK: [[L_BORROW:%.*]] = begin_access [read] [static] [[L]] :
|
|
// CHECK: [[F:%.*]] = function_ref @borrow_lock
|
|
// CHECK: apply [[F]]([[L_BORROW]])
|
|
// CHECK: end_access [[L_BORROW]]
|
|
borrow_lock(l)
|
|
|
|
// CHECK: destroy_addr [[L]]
|
|
// CHECK: dealloc_stack [[L]]
|
|
}
|