([[ROOT_TEMP]], [[KP_COPY]], [[VALUE_TEMP]])
// CHECK-NEXT: dealloc_stack [[VALUE_TEMP]]
// CHECK-NEXT: destroy_addr [[ROOT_TEMP]]
// CHECK-NEXT: dealloc_stack [[ROOT_TEMP]]
// CHECK-NEXT: destroy_value [[KP_COPY]]
writable[keyPath: rkp] = value
} // CHECK-LABEL: } // end sil function '{{.*}}loadable
// CHECK-LABEL: sil hidden [ossa] @{{.*}}addressOnly
func addressOnly(readonly: P, writable: inout P,
value: Q,
kp: KeyPath,
wkp: WritableKeyPath
,
rkp: ReferenceWritableKeyPath
) {
// CHECK: function_ref @swift_getAtKeyPath :
_ = readonly[keyPath: kp]
// CHECK: function_ref @swift_getAtKeyPath :
_ = writable[keyPath: kp]
// CHECK: function_ref @swift_getAtKeyPath :
_ = readonly[keyPath: wkp]
// CHECK: function_ref @swift_getAtKeyPath :
_ = writable[keyPath: wkp]
// CHECK: function_ref @swift_getAtKeyPath :
_ = readonly[keyPath: rkp]
// CHECK: function_ref @swift_getAtKeyPath :
_ = writable[keyPath: rkp]
// CHECK: function_ref @swift_setAtWritableKeyPath :
writable[keyPath: wkp] = value
// CHECK: function_ref @swift_setAtReferenceWritableKeyPath :
readonly[keyPath: rkp] = value
// CHECK: function_ref @swift_setAtReferenceWritableKeyPath :
writable[keyPath: rkp] = value
}
// CHECK-LABEL: sil hidden [ossa] @{{.*}}reabstracted
func reabstracted(readonly: @escaping () -> (),
writable: inout () -> (),
value: @escaping (A) -> B,
kp: KeyPath<() -> (), (A) -> B>,
wkp: WritableKeyPath<() -> (), (A) -> B>,
rkp: ReferenceWritableKeyPath<() -> (), (A) -> B>) {
// CHECK: function_ref @swift_getAtKeyPath :
_ = readonly[keyPath: kp]
// CHECK: function_ref @swift_getAtKeyPath :
_ = writable[keyPath: kp]
// CHECK: function_ref @swift_getAtKeyPath :
_ = readonly[keyPath: wkp]
// CHECK: function_ref @swift_getAtKeyPath :
_ = writable[keyPath: wkp]
// CHECK: function_ref @swift_getAtKeyPath :
_ = readonly[keyPath: rkp]
// CHECK: function_ref @swift_getAtKeyPath :
_ = writable[keyPath: rkp]
// CHECK: function_ref @swift_setAtWritableKeyPath :
writable[keyPath: wkp] = value
// CHECK: function_ref @swift_setAtReferenceWritableKeyPath :
readonly[keyPath: rkp] = value
// CHECK: function_ref @swift_setAtReferenceWritableKeyPath :
writable[keyPath: rkp] = value
}
// CHECK-LABEL: sil hidden [ossa] @{{.*}}partial
func partial(valueA: A,
valueB: Int,
pkpA: PartialKeyPath,
pkpB: PartialKeyPath,
akp: AnyKeyPath) {
// CHECK: [[PROJECT:%.*]] = function_ref @swift_getAtAnyKeyPath :
// CHECK: apply [[PROJECT]]
_ = valueA[keyPath: akp]
// CHECK: [[PROJECT:%.*]] = function_ref @swift_getAtPartialKeyPath :
// CHECK: apply [[PROJECT]]
_ = valueA[keyPath: pkpA]
// CHECK: [[PROJECT:%.*]] = function_ref @swift_getAtAnyKeyPath :
// CHECK: apply [[PROJECT]]
_ = valueB[keyPath: akp]
// CHECK: [[PROJECT:%.*]] = function_ref @swift_getAtPartialKeyPath :
// CHECK: apply [[PROJECT]]
_ = valueB[keyPath: pkpB]
}
extension Int {
var b: Int { get { return 0 } set { } }
var u: Int { get { return 0 } set { } }
var tt: Int { get { return 0 } set { } }
}
// CHECK-LABEL: sil hidden [ossa] @{{.*}}writebackNesting
func writebackNesting(x: inout Int,
y: WritableKeyPath,
z: WritableKeyPath,
w: Int) -> Int {
// -- get 'b'
// CHECK: function_ref @$sSi19keypath_applicationE1bSivg
// -- apply keypath y
// CHECK: [[PROJECT_FN:%.*]] = function_ref @swift_modifyAtWritableKeyPath : $@yield_once @convention(thin) <τ_0_0, τ_0_1> (@inout τ_0_0, @guaranteed WritableKeyPath<τ_0_0, τ_0_1>) -> @yields @inout τ_0_1
// CHECK: ([[Y_ADDR:%.*]], [[Y_TOKEN:%.*]]) = begin_apply [[PROJECT_FN]]
// -- get 'u'
// CHECK: function_ref @$sSi19keypath_applicationE1uSivg
// -- apply keypath z
// CHECK: [[PROJECT_FN:%.*]] = function_ref @swift_modifyAtWritableKeyPath : $@yield_once @convention(thin) <τ_0_0, τ_0_1> (@inout τ_0_0, @guaranteed WritableKeyPath<τ_0_0, τ_0_1>) -> @yields @inout τ_0_1
// CHECK: ([[Z_ADDR:%.*]], [[Z_TOKEN:%.*]]) = begin_apply [[PROJECT_FN]]
// -- set 'tt'
// CHECK: function_ref @$sSi19keypath_applicationE2ttSivs
// -- destroy owner for keypath projection z
// CHECK: end_apply [[Z_TOKEN]]
// -- set 'u'
// CHECK: function_ref @$sSi19keypath_applicationE1uSivs
// -- destroy owner for keypath projection y
// CHECK: end_apply [[Y_TOKEN]]
// -- set 'b'
// CHECK: function_ref @$sSi19keypath_applicationE1bSivs
x.b[keyPath: y].u[keyPath: z].tt = w
}