mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
79 lines
3.0 KiB
Swift
79 lines
3.0 KiB
Swift
// RUN: %target-swift-frontend -parse-stdlib -emit-silgen %s | FileCheck %s
|
|
|
|
struct Int {
|
|
mutating func foo() {}
|
|
}
|
|
|
|
struct Foo<T, U> {
|
|
var f: T -> U
|
|
|
|
var g: T
|
|
}
|
|
|
|
// CHECK-LABEL: sil hidden @_TF20property_abstraction4getF
|
|
// CHECK: bb0([[X_ORIG:%.*]] : $Foo<Int, Int>):
|
|
// CHECK: [[F_ORIG:%.*]] = struct_extract [[X_ORIG]] : $Foo<Int, Int>, #Foo.f
|
|
// CHECK: strong_retain [[F_ORIG]]
|
|
// CHECK: [[REABSTRACT_FN:%.*]] = function_ref @_TTRXFo_iV20property_abstraction3Int_iS0__XFo_dS0__dS0__ : $@convention(thin) (Int, @owned @callee_owned (@out Int, @in Int) -> ()) -> Int
|
|
// CHECK: [[F_SUBST:%.*]] = partial_apply [[REABSTRACT_FN]]([[F_ORIG]])
|
|
// CHECK: return [[F_SUBST]]
|
|
func getF(x: Foo<Int, Int>) -> Int -> Int {
|
|
return x.f
|
|
}
|
|
|
|
// CHECK-LABEL: sil hidden @_TF20property_abstraction4setF
|
|
// CHECK: [[F_ADDR:%.*]] = struct_element_addr {{%.*}} : $*Foo<Int, Int>, #Foo.f
|
|
// CHECK: [[REABSTRACT_FN:%.*]] = function_ref @_TTRXFo_dV20property_abstraction3Int_dS0__XFo_iS0__iS0__ : $@convention(thin) (@out Int, @in Int, @owned @callee_owned (Int) -> Int) -> ()
|
|
// CHECK: [[F_ORIG:%.*]] = partial_apply [[REABSTRACT_FN]]({{%.*}})
|
|
// CHECK: assign [[F_ORIG]] to [[F_ADDR]]
|
|
func setF(inout x: Foo<Int, Int>, f: Int -> Int) {
|
|
x.f = f
|
|
}
|
|
|
|
func inOutFunc(inout f: (Int -> Int)) { }
|
|
|
|
// CHECK-LABEL: sil hidden @_TF20property_abstraction6inOutF
|
|
// CHECK: [[INOUTFUNC:%.*]] = function_ref @_TF20property_abstraction9inOutFunc
|
|
// CHECK: [[F_ADDR:%.*]] = struct_element_addr {{%.*}} : $*Foo<Int, Int>, #Foo.f
|
|
// CHECK: [[F_SUBST_MAT:%.*]] = alloc_stack
|
|
// CHECK: [[F_ORIG:%.*]] = load [[F_ADDR]]
|
|
// CHECK: [[REABSTRACT_FN:%.*]] = function_ref @_TTRXFo_iV20property_abstraction3Int_iS0__XFo_dS0__dS0__ : $@convention(thin) (Int, @owned @callee_owned (@out Int, @in Int) -> ()) -> Int
|
|
// CHECK: [[F_SUBST_IN:%.*]] = partial_apply [[REABSTRACT_FN]]([[F_ORIG]])
|
|
// CHECK: store [[F_SUBST_IN]] to [[F_SUBST_MAT]]
|
|
// CHECK: apply [[INOUTFUNC]]([[F_SUBST_MAT]]#1)
|
|
// CHECK: [[F_SUBST_OUT:%.*]] = load [[F_SUBST_MAT]]
|
|
// CHECK: [[REABSTRACT_FN:%.*]] = function_ref @_TTRXFo_dV20property_abstraction3Int_dS0__XFo_iS0__iS0__ : $@convention(thin) (@out Int, @in Int, @owned @callee_owned (Int) -> Int) -> ()
|
|
// CHECK: [[F_ORIG:%.*]] = partial_apply [[REABSTRACT_FN]]([[F_SUBST_OUT]])
|
|
// CHECK: assign [[F_ORIG]] to [[F_ADDR]]
|
|
func inOutF(var x: Foo<Int, Int>) {
|
|
inOutFunc(&x.f)
|
|
}
|
|
|
|
// Don't produce a writeback for generic lvalues when there's no real
|
|
// abstraction difference. <rdar://problem/16530674>
|
|
// CHECK-LABEL: sil hidden @_TF20property_abstraction23noAbstractionDifference
|
|
func noAbstractionDifference(var x: Foo<Int, Int>) {
|
|
// CHECK: [[ADDR:%.*]] = struct_element_addr {{%.*}}, #Foo.g
|
|
// CHECK: apply {{%.*}}([[ADDR]])
|
|
x.g.foo()
|
|
}
|
|
|
|
/*
|
|
TODO
|
|
enum Bar<T, U> {
|
|
case F(T -> U)
|
|
}
|
|
|
|
func getF(x: Bar<Int, Int>) -> Int -> Int {
|
|
switch x {
|
|
case .F(var f):
|
|
return f
|
|
}
|
|
}
|
|
|
|
func makeF(f: Int -> Int) -> Bar<Int, Int> {
|
|
return Bar.F(f)
|
|
}
|
|
|
|
*/
|