Files
swift-mirror/test/SILOptimizer/issue-68875.swift
Joe Groff 19329e3e03 SILGen: Treat read-formal-accessed lvalues as borrows.
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.
2025-02-04 08:23:34 -08:00

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
}
}