mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Type annotations for instruction operands are omitted, e.g. ``` %3 = struct $S(%1, %2) ``` Operand types are redundant anyway and were only used for sanity checking in the SIL parser. But: operand types _are_ printed if the definition of the operand value was not printed yet. This happens: * if the block with the definition appears after the block where the operand's instruction is located * if a block or instruction is printed in isolation, e.g. in a debugger The old behavior can be restored with `-Xllvm -sil-print-types`. This option is added to many existing test files which check for operand types in their check-lines.
498 lines
20 KiB
Swift
498 lines
20 KiB
Swift
// RUN: %target-swift-frontend -enable-experimental-move-only -o - -Xllvm -sil-print-types -emit-silgen %s | %FileCheck %s
|
|
|
|
final class Klass {
|
|
func useKlass() {}
|
|
|
|
func doSomething() {}
|
|
func doSomething(_ k: Klass) {}
|
|
}
|
|
|
|
func useKlass(_ k: Klass) {}
|
|
|
|
struct Struct {
|
|
var k = Klass()
|
|
|
|
func doSomething() {}
|
|
func doSomething(_ k: Klass) {}
|
|
|
|
var computedK: Klass { Klass() }
|
|
}
|
|
|
|
func useStruct(_ s: Struct) {}
|
|
|
|
/////////////////////////
|
|
// Concrete Type Tests //
|
|
/////////////////////////
|
|
|
|
// CHECK-LABEL: sil hidden [ossa] @$s11borrow_expr13simpleTestArgyyF : $@convention(thin) () -> () {
|
|
// CHECK: [[ADDR:%.*]] = project_box
|
|
//
|
|
// First check without the borrow:
|
|
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[ADDR]]
|
|
// CHECK: [[VAL:%.*]] = load [copy] [[ACCESS]]
|
|
// CHECK: end_access [[ACCESS]]
|
|
// CHECK: [[FUNC:%.*]] = function_ref @$s11borrow_expr9useStructyyAA0D0VF : $@convention(thin) (@guaranteed Struct) -> ()
|
|
// CHECK: apply [[FUNC]]([[VAL]])
|
|
// CHECK: destroy_value [[VAL]]
|
|
//
|
|
// Now with the borrow:
|
|
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[ADDR]]
|
|
// CHECK: [[VAL:%.*]] = load_borrow [[ACCESS]]
|
|
// CHECK: [[FUNC:%.*]] = function_ref @$s11borrow_expr9useStructyyAA0D0VF : $@convention(thin) (@guaranteed Struct) -> ()
|
|
// CHECK: apply [[FUNC]]([[VAL]])
|
|
// CHECK: end_borrow [[VAL]]
|
|
// CHECK: end_access [[ACCESS]]
|
|
// CHECK: } // end sil function '$s11borrow_expr13simpleTestArgyyF'
|
|
func simpleTestArg() {
|
|
var s = Struct()
|
|
s = Struct()
|
|
// Without borrow.
|
|
useStruct(s)
|
|
// With borrow.
|
|
useStruct(_borrow s)
|
|
}
|
|
|
|
// CHECK-LABEL: sil hidden [ossa] @$s11borrow_expr18simpleTestArgFieldyyF : $@convention(thin) () -> () {
|
|
// CHECK: [[ADDR:%.*]] = project_box
|
|
//
|
|
// First check without the borrow:
|
|
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[ADDR]]
|
|
// CHECK: [[GEP:%.*]] = struct_element_addr [[ACCESS]] : $*Struct, #Struct.k
|
|
// CHECK: [[VAL:%.*]] = load [copy] [[GEP]]
|
|
// CHECK: end_access [[ACCESS]]
|
|
// CHECK: [[FUNC:%.*]] = function_ref @$s11borrow_expr8useKlassyyAA0D0CF : $@convention(thin) (@guaranteed Klass) -> ()
|
|
// CHECK: apply [[FUNC]]([[VAL]])
|
|
// CHECK: destroy_value [[VAL]]
|
|
//
|
|
// Now with the borrow:
|
|
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[ADDR]]
|
|
// CHECK: [[GEP:%.*]] = struct_element_addr [[ACCESS]] : $*Struct, #Struct.k
|
|
// CHECK: [[VAL:%.*]] = load_borrow [[GEP]]
|
|
// CHECK: [[FUNC:%.*]] = function_ref @$s11borrow_expr8useKlassyyAA0D0CF : $@convention(thin) (@guaranteed Klass) -> ()
|
|
// CHECK: apply [[FUNC]]([[VAL]])
|
|
// CHECK: end_borrow [[VAL]]
|
|
// CHECK: end_access [[ACCESS]]
|
|
// CHECK: } // end sil function '$s11borrow_expr18simpleTestArgFieldyyF'
|
|
func simpleTestArgField() {
|
|
var s = Struct()
|
|
s = Struct()
|
|
// Without borrow.
|
|
useKlass(s.k)
|
|
// With borrow.
|
|
useKlass(_borrow s.k)
|
|
}
|
|
|
|
// CHECK-LABEL: sil hidden [ossa] @$s11borrow_expr14simpleTestSelfyyF : $@convention(thin) () -> () {
|
|
// CHECK: [[ADDR:%.*]] = project_box
|
|
//
|
|
// First check without the borrow:
|
|
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[ADDR]]
|
|
// CHECK: [[VAL:%.*]] = load [copy] [[ACCESS]]
|
|
// CHECK: end_access [[ACCESS]]
|
|
// CHECK: [[FUNC:%.*]] = function_ref @$s11borrow_expr6StructV11doSomethingyyF : $@convention(method) (@guaranteed Struct) -> ()
|
|
// CHECK: apply [[FUNC]]([[VAL]])
|
|
// CHECK: destroy_value [[VAL]]
|
|
//
|
|
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[ADDR]]
|
|
// CHECK: [[VAL:%.*]] = load [copy] [[ACCESS]]
|
|
// CHECK: end_access [[ACCESS]]
|
|
// CHECK: [[FUNC:%.*]] = function_ref @$s11borrow_expr6StructV11doSomethingyyAA5KlassCF : $@convention(method) (@guaranteed Klass, @guaranteed Struct) -> ()
|
|
// CHECK: apply [[FUNC]]({{%.*}}, [[VAL]])
|
|
// CHECK: destroy_value [[VAL]]
|
|
//
|
|
// Now with the borrow:
|
|
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[ADDR]]
|
|
// CHECK: [[VAL:%.*]] = load_borrow [[ACCESS]]
|
|
// CHECK: [[FUNC:%.*]] = function_ref @$s11borrow_expr6StructV11doSomethingyyF : $@convention(method) (@guaranteed Struct) -> ()
|
|
// CHECK: apply [[FUNC]]([[VAL]])
|
|
// CHECK: end_borrow [[VAL]]
|
|
// CHECK: end_access [[ACCESS]]
|
|
//
|
|
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[ADDR]]
|
|
// CHECK: [[VAL:%.*]] = load_borrow [[ACCESS]]
|
|
// CHECK: [[FUNC:%.*]] = function_ref @$s11borrow_expr6StructV11doSomethingyyAA5KlassCF : $@convention(method) (@guaranteed Klass, @guaranteed Struct) -> ()
|
|
// CHECK: apply [[FUNC]]({{%.*}}, [[VAL]])
|
|
// CHECK: end_borrow [[VAL]]
|
|
// CHECK: end_access [[ACCESS]]
|
|
//
|
|
// CHECK: } // end sil function '$s11borrow_expr14simpleTestSelfyyF'
|
|
func simpleTestSelf() {
|
|
var s = Struct()
|
|
s = Struct()
|
|
// Without borrow.
|
|
s.doSomething()
|
|
s.doSomething(Klass())
|
|
|
|
// With borrow.
|
|
(_borrow s).doSomething()
|
|
(_borrow s).doSomething(Klass())
|
|
}
|
|
|
|
// CHECK-LABEL: sil hidden [ossa] @$s11borrow_expr19simpleTestSelfFieldyyF : $@convention(thin) () -> () {
|
|
// CHECK: [[ADDR:%.*]] = project_box
|
|
//
|
|
// First check without the borrow:
|
|
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[ADDR]]
|
|
// CHECK: [[GEP:%.*]] = struct_element_addr [[ACCESS]] : $*Struct, #Struct.k
|
|
// CHECK: [[VAL:%.*]] = load [copy] [[GEP]]
|
|
// CHECK: end_access [[ACCESS]]
|
|
// CHECK: [[FUNC:%.*]] = function_ref @$s11borrow_expr5KlassC11doSomethingyyF : $@convention(method) (@guaranteed Klass) -> ()
|
|
// CHECK: apply [[FUNC]]([[VAL]])
|
|
// CHECK: destroy_value [[VAL]]
|
|
//
|
|
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[ADDR]]
|
|
// CHECK: [[GEP:%.*]] = struct_element_addr [[ACCESS]] : $*Struct, #Struct.k
|
|
// CHECK: [[VAL:%.*]] = load [copy] [[GEP]]
|
|
// CHECK: end_access [[ACCESS]]
|
|
// CHECK: [[FUNC:%.*]] = function_ref @$s11borrow_expr5KlassC11doSomethingyyACF : $@convention(method) (@guaranteed Klass, @guaranteed Klass) -> ()
|
|
// CHECK: apply [[FUNC]]({{%.*}}, [[VAL]])
|
|
// CHECK: destroy_value [[VAL]]
|
|
//
|
|
// Now with the borrow:
|
|
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[ADDR]]
|
|
// CHECK: [[GEP:%.*]] = struct_element_addr [[ACCESS]] : $*Struct, #Struct.k
|
|
// CHECK: [[VAL:%.*]] = load_borrow [[GEP]]
|
|
// CHECK: [[FUNC:%.*]] = function_ref @$s11borrow_expr5KlassC11doSomethingyyF : $@convention(method) (@guaranteed Klass) -> (
|
|
// CHECK: apply [[FUNC]]([[VAL]])
|
|
// CHECK: end_borrow [[VAL]]
|
|
// CHECK: end_access [[ACCESS]]
|
|
//
|
|
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[ADDR]]
|
|
// CHECK: [[GEP:%.*]] = struct_element_addr [[ACCESS]] : $*Struct, #Struct.k
|
|
// CHECK: [[VAL:%.*]] = load_borrow [[GEP]]
|
|
// CHECK: [[FUNC:%.*]] = function_ref @$s11borrow_expr5KlassC11doSomethingyyACF : $@convention(method) (@guaranteed Klass, @guaranteed Klass) -> ()
|
|
// CHECK: apply [[FUNC]]({{%.*}}, [[VAL]])
|
|
// CHECK: end_borrow [[VAL]]
|
|
// CHECK: end_access [[ACCESS]]
|
|
//
|
|
// CHECK: } // end sil function '$s11borrow_expr19simpleTestSelfFieldyyF'
|
|
func simpleTestSelfField() {
|
|
var s = Struct()
|
|
s = Struct()
|
|
// Without borrow.
|
|
s.k.doSomething()
|
|
s.k.doSomething(Klass())
|
|
|
|
// With borrow.
|
|
(_borrow s.k).doSomething()
|
|
(_borrow s.k).doSomething(Klass())
|
|
}
|
|
|
|
////////////////////////
|
|
// Address Only Tests //
|
|
////////////////////////
|
|
|
|
protocol Q {
|
|
}
|
|
|
|
protocol P {
|
|
var q: Q { get /*_read*/ }
|
|
func doSomething()
|
|
func doSomething(_ k: Klass)
|
|
|
|
mutating func mutatingExtensionPointCallMethodOnSelf()
|
|
mutating func mutatingExtensionPointPassSelfAsArg()
|
|
}
|
|
|
|
func usePExistential(_ p: P) {}
|
|
func usePGeneric<T : P>(_ p: T) {}
|
|
func useQExistential<T : Q>(_ q: T) {}
|
|
func useQGeneric<T : Q>(_ q: T) {}
|
|
|
|
//--------------------------------------------------------------------------------
|
|
// Generics
|
|
//
|
|
|
|
// CHECK-LABEL: sil hidden [ossa] @$s11borrow_expr20simpleTestGenericArgyyxAA1PRzlF : $@convention(thin) <T where T : P> (@in_guaranteed T) -> () {
|
|
// CHECK: [[ADDR:%.*]] = project_box
|
|
//
|
|
// First without borrow.
|
|
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[ADDR]]
|
|
// CHECK: [[STACK:%.*]] = alloc_stack $T
|
|
// CHECK: copy_addr [[ACCESS]] to [init] [[STACK]]
|
|
// CHECK: end_access [[ACCESS]]
|
|
// CHECK: [[FUNC:%.*]] = function_ref @$s11borrow_expr11usePGenericyyxAA1PRzlF : $@convention(thin) <τ_0_0 where τ_0_0 : P> (@in_guaranteed τ_0_0) -> ()
|
|
// CHECK: apply [[FUNC]]<T>([[STACK]])
|
|
// CHECK: destroy_addr [[STACK]]
|
|
// CHECK: dealloc_stack [[STACK]]
|
|
//
|
|
// Now with borrow
|
|
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[ADDR]]
|
|
// CHECK: [[FUNC:%.*]] = function_ref @$s11borrow_expr11usePGenericyyxAA1PRzlF : $@convention(thin) <τ_0_0 where τ_0_0 : P> (@in_guaranteed τ_0_0) -> ()
|
|
// CHECK: apply [[FUNC]]<T>([[ACCESS]])
|
|
// CHECK: end_access [[ACCESS]]
|
|
// CHECK: } // end sil function '$s11borrow_expr20simpleTestGenericArgyyxAA1PRzlF'
|
|
func simpleTestGenericArg<T : P>(_ pArg: T) {
|
|
var p = pArg
|
|
p = pArg
|
|
|
|
// Without borrow.
|
|
usePGeneric(p)
|
|
|
|
// With borrow.
|
|
usePGeneric(_borrow p)
|
|
}
|
|
|
|
// CHECK-LABEL: sil hidden [ossa] @$s11borrow_expr25simpleTestGenericArgFieldyyxAA1PRzlF : $@convention(thin) <T where T : P> (@in_guaranteed T) -> () {
|
|
// CHECK: } // end sil function '$s11borrow_expr25simpleTestGenericArgFieldyyxAA1PRzlF'
|
|
func simpleTestGenericArgField<T : P>(_ pArg: T) {
|
|
var p = pArg
|
|
p = pArg
|
|
|
|
// Without borrow.
|
|
useQGeneric(p.q)
|
|
|
|
// With borrow.
|
|
//
|
|
// TODO: This doesn't work now. We should support this potentially for
|
|
// _read. But protocols seem to not support _read at this time.
|
|
// useQGeneric(_borrow p.q)
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------
|
|
// Exisentials
|
|
//
|
|
|
|
// CHECK-LABEL: sil hidden [ossa] @$s11borrow_expr24simpleTestExistentialArgyyAA1P_pF : $@convention(thin) (@in_guaranteed any P) -> () {
|
|
// CHECK: [[ADDR:%.*]] = project_box {{%.*}} : ${ var any P }, 0
|
|
//
|
|
// First without the borrow.
|
|
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[ADDR]]
|
|
// CHECK: [[STACK:%.*]] = alloc_stack $any P
|
|
// CHECK: copy_addr [[ACCESS]] to [init] [[STACK]]
|
|
// CHECK: end_access [[ACCESS]]
|
|
// CHECK: [[FUNC:%.*]] = function_ref @$s11borrow_expr15usePExistentialyyAA1P_pF : $@convention(thin) (@in_guaranteed any P) -> ()
|
|
// CHECK: apply [[FUNC]]([[STACK]])
|
|
// CHECK: destroy_addr [[STACK]]
|
|
// CHECK: dealloc_stack [[STACK]]
|
|
//
|
|
// Now with the borrow.
|
|
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[ADDR]]
|
|
// CHECK: [[FUNC:%.*]] = function_ref @$s11borrow_expr15usePExistentialyyAA1P_pF : $@convention(thin) (@in_guaranteed any P) -> ()
|
|
// CHECK: apply [[FUNC]]([[ACCESS]])
|
|
// CHECK: end_access [[ACCESS]]
|
|
// CHECK: } // end sil function '$s11borrow_expr24simpleTestExistentialArgyyAA1P_pF'
|
|
func simpleTestExistentialArg(_ pArg: P) {
|
|
var p = pArg
|
|
p = pArg
|
|
|
|
// Without borrow.
|
|
usePExistential(p)
|
|
|
|
// With borrow.
|
|
usePExistential(_borrow p)
|
|
}
|
|
|
|
|
|
func simpleTestExistentialArgField(_ pArg: P) {
|
|
var p = pArg
|
|
p = pArg
|
|
|
|
// Without borrow.
|
|
useQGeneric(p.q)
|
|
|
|
// With borrow.
|
|
//
|
|
// TODO: This doesn't work now. We should support this potentially for
|
|
// _read. But protocols seem to not support _read at this time.
|
|
// useQGeneric(_borrow p.q)
|
|
}
|
|
|
|
/////////////
|
|
// Globals //
|
|
/////////////
|
|
|
|
var globalKlass = Klass()
|
|
|
|
// CHECK-LABEL: sil hidden [ossa] @$s11borrow_expr0A6GlobalyyF : $@convention(thin) () -> () {
|
|
// CHECK: [[ADDR:%.*]] = global_addr @$s11borrow_expr11globalKlassAA0D0Cvp
|
|
// CHECK: [[ACCESS:%.*]] = begin_access [read] [dynamic] [[ADDR]]
|
|
// CHECK: [[VAL:%.*]] = load_borrow [[ACCESS]]
|
|
// CHECK: [[FUNC:%.*]] = function_ref @$s11borrow_expr5KlassC11doSomethingyyF : $@convention(method) (@guaranteed Klass) -> ()
|
|
// CHECK: apply [[FUNC]]([[VAL]]
|
|
// CHECK: end_borrow [[VAL]]
|
|
// CHECK: end_access [[ACCESS]]
|
|
// CHECK: [[ACCESS:%.*]] = begin_access [read] [dynamic] [[ADDR]]
|
|
// CHECK: [[VAL:%.*]] = load_borrow [[ACCESS]]
|
|
// CHECK: [[FUNC:%.*]] = function_ref @$s11borrow_expr8useKlassyyAA0D0CF : $@convention(thin) (@guaranteed Klass) -> ()
|
|
// CHECK: apply [[FUNC]]([[VAL]])
|
|
// CHECK: end_borrow [[VAL]]
|
|
// CHECK: end_access [[ACCESS]]
|
|
// CHECK: } // end sil function '$s11borrow_expr0A6GlobalyyF'
|
|
func borrowGlobal() {
|
|
(_borrow globalKlass).doSomething()
|
|
useKlass(_borrow globalKlass)
|
|
}
|
|
|
|
/////////////
|
|
// Methods //
|
|
/////////////
|
|
|
|
struct MethodTestingStruct {
|
|
var k = Klass()
|
|
|
|
func doSomething() {}
|
|
|
|
// CHECK-LABEL: sil hidden [ossa] @$s11borrow_expr19MethodTestingStructV012mutatingCallC6OnSelfyyF : $@convention(method) (@inout MethodTestingStruct) -> () {
|
|
// CHECK: bb0([[SELF:%.*]] :
|
|
//
|
|
// Without borrow
|
|
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[SELF]]
|
|
// CHECK: [[VAL:%.*]] = load [copy] [[ACCESS]]
|
|
// CHECK: end_access [[ACCESS]]
|
|
// CHECK: [[FUNC:%.*]] = function_ref @$s11borrow_expr19MethodTestingStructV11doSomethingyyF : $@convention(method) (@guaranteed MethodTestingStruct) -> ()
|
|
// CHECK: apply [[FUNC]]([[VAL]])
|
|
// CHECK: destroy_value [[VAL]]
|
|
//
|
|
// With borrow
|
|
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[SELF]]
|
|
// CHECK: [[VAL:%.*]] = load_borrow [[ACCESS]]
|
|
// CHECK: [[FUNC:%.*]] = function_ref @$s11borrow_expr19MethodTestingStructV11doSomethingyyF : $@convention(method) (@guaranteed MethodTestingStruct) -> ()
|
|
// CHECK: apply [[FUNC]]([[VAL]])
|
|
// CHECK: end_borrow [[VAL]]
|
|
// CHECK: end_access [[ACCESS]]
|
|
// CHECK: } // end sil function '$s11borrow_expr19MethodTestingStructV012mutatingCallC6OnSelfyyF'
|
|
mutating func mutatingCallMethodOnSelf() {
|
|
// Without borrow
|
|
doSomething()
|
|
// With borrow
|
|
(_borrow self).doSomething()
|
|
}
|
|
|
|
// CHECK-LABEL: sil hidden [ossa] @$s11borrow_expr19MethodTestingStructV26mutatingPassSelfAsArgumentyyF : $@convention(method) (@inout MethodTestingStruct) -> () {
|
|
// CHECK: bb0([[SELF:%.*]] :
|
|
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[SELF]]
|
|
// CHECK: [[VAL:%.*]] = load [copy] [[ACCESS]]
|
|
// CHECK: end_access [[ACCESS]]
|
|
// CHECK: [[FUNC:%.*]] = function_ref @$s11borrow_expr22useMethodTestingStructyyAA0deF0VF : $@convention(thin) (@guaranteed MethodTestingStruct) -> ()
|
|
// CHECK: apply [[FUNC]]([[VAL]])
|
|
// CHECK: destroy_value [[VAL]]
|
|
//
|
|
// With borrow
|
|
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[SELF]]
|
|
// CHECK: [[VAL:%.*]] = load_borrow [[ACCESS]]
|
|
// CHECK: [[FUNC:%.*]] = function_ref @$s11borrow_expr22useMethodTestingStructyyAA0deF0VF : $@convention(thin) (@guaranteed MethodTestingStruct) -> ()
|
|
// CHECK: apply [[FUNC]]([[VAL]])
|
|
// CHECK: end_borrow [[VAL]]
|
|
// CHECK: end_access [[ACCESS]]
|
|
// CHECK: } // end sil function '$s11borrow_expr19MethodTestingStructV26mutatingPassSelfAsArgumentyyF'
|
|
mutating func mutatingPassSelfAsArgument() {
|
|
// Without borrow
|
|
useMethodTestingStruct(self)
|
|
// With borrow
|
|
useMethodTestingStruct(_borrow self)
|
|
}
|
|
}
|
|
|
|
func useMethodTestingStruct(_ x: MethodTestingStruct) {}
|
|
|
|
extension P {
|
|
// CHECK-LABEL: sil hidden [ossa] @$s11borrow_expr1PPAAE27mutatingCallingMethodOnSelfyyF : $@convention(method) <Self where Self : P> (@inout Self) -> () {
|
|
// CHECK: bb0([[ADDR:%.*]] :
|
|
//
|
|
// First without borrow.
|
|
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[ADDR]]
|
|
// CHECK: [[STACK:%.*]] = alloc_stack $Self
|
|
// CHECK: copy_addr [[ACCESS]] to [init] [[STACK]]
|
|
// CHECK: end_access [[ACCESS]]
|
|
// CHECK: [[FUNC:%.*]] = witness_method $Self, #P.doSomething : <Self where Self : P> (Self) -> () -> () : $@convention(witness_method: P) <τ_0_0 where τ_0_0 : P> (@in_guaranteed τ_0_0) -> ()
|
|
// CHECK: apply [[FUNC]]<Self>([[STACK]])
|
|
// CHECK: destroy_addr [[STACK]]
|
|
// CHECK: dealloc_stack [[STACK]]
|
|
//
|
|
// Now with borrow
|
|
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[ADDR]]
|
|
// CHECK: [[FUNC:%.*]] = witness_method $Self, #P.doSomething : <Self where Self : P> (Self) -> () -> () : $@convention(witness_method: P) <τ_0_0 where τ_0_0 : P> (@in_guaranteed τ_0_0) -> ()
|
|
// CHECK: apply [[FUNC]]<Self>([[ACCESS]])
|
|
// CHECK: end_access [[ACCESS]]
|
|
// CHECK: } // end sil function '$s11borrow_expr1PPAAE27mutatingCallingMethodOnSelfyyF'
|
|
mutating func mutatingCallingMethodOnSelf() {
|
|
// Without borrow
|
|
doSomething()
|
|
|
|
// With borrow
|
|
(_borrow self).doSomething()
|
|
}
|
|
|
|
// CHECK-LABEL: sil hidden [ossa] @$s11borrow_expr1PPAAE26mutatingPassSelfAsArgumentyyF : $@convention(method) <Self where Self : P> (@inout Self) -> () {
|
|
// CHECK: bb0([[ADDR:%.*]] :
|
|
//
|
|
// First without borrow.
|
|
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[ADDR]]
|
|
// CHECK: [[STACK:%.*]] = alloc_stack $Self
|
|
// CHECK: copy_addr [[ACCESS]] to [init] [[STACK]]
|
|
// CHECK: end_access [[ACCESS]]
|
|
// CHECK: [[FUNC:%.*]] = function_ref @$s11borrow_expr11usePGenericyyxAA1PRzlF : $@convention(thin) <τ_0_0 where τ_0_0 : P> (@in_guaranteed τ_0_0) -> ()
|
|
// CHECK: apply [[FUNC]]<Self>([[STACK]])
|
|
// CHECK: destroy_addr [[STACK]]
|
|
// CHECK: dealloc_stack [[STACK]]
|
|
//
|
|
// Now with borrow
|
|
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[ADDR]]
|
|
// CHECK: [[FUNC:%.*]] = function_ref @$s11borrow_expr11usePGenericyyxAA1PRzlF : $@convention(thin) <τ_0_0 where τ_0_0 : P> (@in_guaranteed τ_0_0) -> ()
|
|
// CHECK: apply [[FUNC]]<Self>([[ACCESS]])
|
|
// CHECK: end_access [[ACCESS]]
|
|
// CHECK: } // end sil function '$s11borrow_expr1PPAAE26mutatingPassSelfAsArgumentyyF'
|
|
mutating func mutatingPassSelfAsArgument() {
|
|
// Without borrow
|
|
usePGeneric(self)
|
|
|
|
// With borrow
|
|
usePGeneric(_borrow self)
|
|
}
|
|
|
|
// CHECK-LABEL: sil hidden [ossa] @$s11borrow_expr1PPAAE38mutatingExtensionPointCallMethodOnSelfyyF : $@convention(method) <Self where Self : P> (@inout Self) -> () {
|
|
// CHECK: bb0([[ADDR:%.*]] :
|
|
//
|
|
// First without borrow.
|
|
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[ADDR]]
|
|
// CHECK: [[STACK:%.*]] = alloc_stack $Self
|
|
// CHECK: copy_addr [[ACCESS]] to [init] [[STACK]]
|
|
// CHECK: end_access [[ACCESS]]
|
|
// CHECK: [[FUNC:%.*]] = witness_method $Self, #P.doSomething : <Self where Self : P> (Self) -> () -> () : $@convention(witness_method: P) <τ_0_0 where τ_0_0 : P> (@in_guaranteed τ_0_0) -> ()
|
|
// CHECK: apply [[FUNC]]<Self>([[STACK]])
|
|
// CHECK: destroy_addr [[STACK]]
|
|
// CHECK: dealloc_stack [[STACK]]
|
|
//
|
|
// Now with borrow
|
|
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[ADDR]]
|
|
// CHECK: [[FUNC:%.*]] = witness_method $Self, #P.doSomething : <Self where Self : P> (Self) -> () -> () : $@convention(witness_method: P) <τ_0_0 where τ_0_0 : P> (@in_guaranteed τ_0_0) -> ()
|
|
// CHECK: apply [[FUNC]]<Self>([[ACCESS]])
|
|
// CHECK: end_access [[ACCESS]]
|
|
// CHECK: } // end sil function '$s11borrow_expr1PPAAE38mutatingExtensionPointCallMethodOnSelfyyF'
|
|
mutating func mutatingExtensionPointCallMethodOnSelf() {
|
|
// Without borrow
|
|
doSomething()
|
|
|
|
// With borrow
|
|
(_borrow self).doSomething()
|
|
}
|
|
|
|
// CHECK-LABEL: sil hidden [ossa] @$s11borrow_expr1PPAAE35mutatingExtensionPointPassSelfAsArgyyF : $@convention(method) <Self where Self : P> (@inout Self) -> () {
|
|
// CHECK: bb0([[ADDR:%.*]] :
|
|
//
|
|
// First without borrow.
|
|
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[ADDR]]
|
|
// CHECK: [[STACK:%.*]] = alloc_stack $Self
|
|
// CHECK: copy_addr [[ACCESS]] to [init] [[STACK]]
|
|
// CHECK: end_access [[ACCESS]]
|
|
// CHECK: [[FUNC:%.*]] = function_ref @$s11borrow_expr11usePGenericyyxAA1PRzlF : $@convention(thin) <τ_0_0 where τ_0_0 : P> (@in_guaranteed τ_0_0) -> ()
|
|
// CHECK: apply [[FUNC]]<Self>([[STACK]])
|
|
// CHECK: destroy_addr [[STACK]]
|
|
// CHECK: dealloc_stack [[STACK]]
|
|
//
|
|
// Now with borrow
|
|
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[ADDR]]
|
|
// CHECK: [[FUNC:%.*]] = function_ref @$s11borrow_expr11usePGenericyyxAA1PRzlF : $@convention(thin) <τ_0_0 where τ_0_0 : P> (@in_guaranteed τ_0_0) -> ()
|
|
// CHECK: apply [[FUNC]]<Self>([[ACCESS]])
|
|
// CHECK: end_access [[ACCESS]]
|
|
// CHECK: } // end sil function '$s11borrow_expr1PPAAE35mutatingExtensionPointPassSelfAsArgyyF'
|
|
mutating func mutatingExtensionPointPassSelfAsArg() {
|
|
// Without borrow
|
|
usePGeneric(self)
|
|
|
|
// With borrow
|
|
usePGeneric(_borrow self)
|
|
}
|
|
}
|