mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
A read access asserts that the memory location is immutable for the duration of the access, so it can be treated as a borrow rather than a mutable lvalue. Doing this allows the borrow formal access scope fixes from #79084 to apply to situations where a loadable type undergoes an accessor-based access with indirect arguments (such as for public accessors when library evolution is enabled for the type). Fixes rdar://143334632.
40 lines
1.7 KiB
Swift
40 lines
1.7 KiB
Swift
// RUN: %target-swift-frontend %s -Xllvm -sil-print-types -emit-silgen | %FileCheck %s
|
|
|
|
public struct ID {
|
|
var a: Int = 0
|
|
var b: Int = 1
|
|
var c: Int = 2
|
|
var d: Int = 3
|
|
var e: Int = 4
|
|
var description: String = ""
|
|
var mirror: Mirror
|
|
}
|
|
|
|
struct Test {
|
|
let id: ID
|
|
private var _name: String
|
|
|
|
var name: String {
|
|
@storageRestrictions(initializes: _name)
|
|
init { _name = newValue }
|
|
|
|
get { _name }
|
|
|
|
nonmutating set {}
|
|
}
|
|
|
|
// CHECK-LABEL: sil hidden [ossa] @$s4main4TestV2id4nameAcA2IDV_SStcfC : $@convention(method) (@in ID, @owned String, @thin Test.Type) -> @out Test
|
|
// CHECK: [[SELF:%.*]] = project_box {{.*}} : ${ var Test }, 0
|
|
// CHECK: [[SELF_REF:%.*]] = begin_access [read] [unknown] [[SELF]] : $*Test
|
|
// CHECK: [[INIT_REF:%.*]] = function_ref @$s4main4TestV4nameSSvi : $@convention(thin) (@owned String, @thin Test.Type) -> @out String
|
|
// CHECK-NEXT: [[METATYPE:%.*]] = metatype $@thin Test.Type
|
|
// CHECK-NEXT: [[INIT:%.*]] = partial_apply [callee_guaranteed] [on_stack] [[INIT_REF]]([[METATYPE]]) : $@convention(thin) (@owned String, @thin Test.Type) -> @out String
|
|
// CHECK: [[SETTER_REF:%.*]] = function_ref @$s4main4TestV4nameSSvs : $@convention(method) (@owned String, @in_guaranteed Test) -> ()
|
|
// CHECK-NEXT: [[SETTER:%.*]] = partial_apply [callee_guaranteed] [on_stack] [[SETTER_REF]]([[SELF_REF]]) : $@convention(method) (@owned String, @in_guaranteed Test) -> ()
|
|
// CHECK-NEXT: assign_or_init #Test.name, self [[SELF]] : $*Test, value {{.*}} : $String, init [[INIT]] : $@noescape @callee_guaranteed (@owned String) -> @out String, set [[SETTER]] : $@noescape @callee_guaranteed (@owned String) -> ()
|
|
init(id: ID, name: String) {
|
|
self.id = id
|
|
self.name = name
|
|
}
|
|
}
|