forked from swiftlang/swift
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathreabstract.swift
66 lines (56 loc) · 2.63 KB
/
reabstract.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// RUN: %target-swift-frontend -Xllvm -sil-full-demangle -emit-silgen %s | %FileCheck %s
func takeFn<T>(_ f : (T) -> T?) {}
func liftOptional(_ x : Int) -> Int? { return x }
func test0() {
takeFn(liftOptional)
}
// CHECK: sil hidden @_TF10reabstract5test0FT_T_ : $@convention(thin) () -> () {
// CHECK: [[T0:%.*]] = function_ref @_TF10reabstract6takeFn
// Emit a generalized reference to liftOptional.
// TODO: just emit a globalized thunk
// CHECK-NEXT: reabstract.liftOptional
// CHECK-NEXT: [[T1:%.*]] = function_ref @_TF10reabstract12liftOptional
// CHECK-NEXT: [[T2:%.*]] = thin_to_thick_function [[T1]]
// CHECK-NEXT: reabstraction thunk
// CHECK-NEXT: [[T3:%.*]] = function_ref [[THUNK:@.*]] :
// CHECK-NEXT: [[T4:%.*]] = partial_apply [[T3]]([[T2]])
// CHECK-NEXT: apply [[T0]]<Int>([[T4]])
// CHECK-NEXT: tuple ()
// CHECK-NEXT: return
// CHECK: sil shared [transparent] [reabstraction_thunk] [[THUNK]] : $@convention(thin) (@in Int, @owned @callee_owned (Int) -> Optional<Int>) -> @out Optional<Int> {
// CHECK: [[T0:%.*]] = load [trivial] %1 : $*Int
// CHECK-NEXT: [[T1:%.*]] = apply %2([[T0]])
// CHECK-NEXT: store [[T1]] to [trivial] %0
// CHECK-NEXT: tuple ()
// CHECK-NEXT: return
// CHECK-LABEL: sil hidden @_TF10reabstract10testThrowsFP_T_
// CHECK: function_ref @_TTRXFo_iT__iT__XFo___
// CHECK: function_ref @_TTRXFo_iT__iT_zoPs5Error__XFo__zoPS___
func testThrows(_ x: Any) {
_ = x as? () -> ()
_ = x as? () throws -> ()
}
// Make sure that we preserve inout-ness when lowering types with maximum
// abstraction level -- <rdar://problem/21329377>
class C {}
struct Box<T> {
let t: T
}
func notFun(_ c: inout C, i: Int) {}
func testInoutOpaque(_ c: C, i: Int) {
var c = c
let box = Box(t: notFun)
box.t(&c, i)
}
// CHECK-LABEL: sil hidden @_TF10reabstract15testInoutOpaqueFTCS_1C1iSi_T_
// CHECK: function_ref @_TF10reabstract6notFunFTRCS_1C1iSi_T_
// CHECK: thin_to_thick_function {{%[0-9]+}}
// CHECK: function_ref @_TTRXFo_lC10reabstract1CdSi__XFo_lS0_iSi_iT__
// CHECK: partial_apply
// CHECK: store
// CHECK: load
// CHECK: function_ref @_TTRXFo_lC10reabstract1CiSi_iT__XFo_lS0_dSi__
// CHECK: partial_apply
// CHECK: apply
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_TTRXFo_lC10reabstract1CdSi__XFo_lS0_iSi_iT__ : $@convention(thin) (@inout C, @in Int, @owned @callee_owned (@inout C, Int) -> ()) -> @out () {
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_TTRXFo_lC10reabstract1CiSi_iT__XFo_lS0_dSi__ : $@convention(thin) (@inout C, Int, @owned @callee_owned (@inout C, @in Int) -> @out ()) -> () {