@@ -25,4 +25,141 @@ extension Optional {
25
25
// CHECK-NEXT: return [[RET]] : $()
26
26
// CHECK-NEXT: }
27
27
}
28
+
29
+ // CHECK-LABEL: sil hidden [ossa] @$sSq24init_delegation_optionalE9failable1xSgSgyt_tcfC
30
+ init ? ( failable1: ( ) ) {
31
+ // CHECK: bb0([[OUT:%[0-9]+]] : $*Optional<Optional<Wrapped>>, [[SELF_META:%[0-9]+]] : $@thin Optional<Wrapped>.Type):
32
+ // CHECK-NEXT: [[SELF_BOX:%[0-9]+]] = alloc_box $<τ_0_0> { var Optional<τ_0_0> } <Wrapped>, var
33
+ // CHECK-NEXT: [[MARKED_SELF_BOX:%[0-9]+]] = mark_uninitialized [delegatingself] [[SELF_BOX]]
34
+ // CHECK-NEXT: [[SELF_LIFETIME:%[0-9]+]] = begin_borrow [lexical] [[MARKED_SELF_BOX]]
35
+ // CHECK-NEXT: [[PB:%[0-9]+]] = project_box [[SELF_LIFETIME]]
36
+ // CHECK: [[RESULT_ADDR:%[0-9]+]] = alloc_stack $Optional<Wrapped>
37
+ // CHECK: [[DELEG_INIT:%[0-9]+]] = function_ref @$sSq24init_delegation_optionalE12nonFailable1xSgyt_tcfC
38
+ // CHECK-NEXT: apply [[DELEG_INIT]]<Wrapped>([[RESULT_ADDR]], [[SELF_META]])
39
+ self . init ( nonFailable1: ( ) )
40
+ // CHECK-NEXT: copy_addr [take] [[RESULT_ADDR]] to [[PB]]
41
+ // CHECK-NEXT: dealloc_stack [[RESULT_ADDR]]
42
+ // CHECK-NEXT: [[OUT_SOME_ADDR:%[0-9]+]] = init_enum_data_addr [[OUT]] : {{.*}}, #Optional.some!enumelt
43
+ // CHECK-NEXT: copy_addr [[PB]] to [initialization] [[OUT_SOME_ADDR]]
44
+ // CHECK-NEXT: inject_enum_addr [[OUT]] : {{.*}}, #Optional.some!enumelt
45
+ // CHECK-NEXT: end_borrow [[SELF_LIFETIME]]
46
+ // CHECK-NEXT: destroy_value [[MARKED_SELF_BOX]]
47
+ // CHECK-NEXT: br bb2
48
+ //
49
+ // FIXME: Dead branch
50
+ // CHECK: bb1:
51
+ //
52
+ // CHECK: bb2:
53
+ // CHECK-NEXT: [[RET:%[0-9]+]] = tuple ()
54
+ // CHECK-NEXT: return [[RET]] : $()
55
+ // CHECK-NEXT: }
56
+ }
57
+
58
+ // CHECK-LABEL: sil hidden [ossa] @$sSq24init_delegation_optionalE9failable2xSgSgyt_tcfC
59
+ init ? ( failable2: ( ) ) {
60
+ // CHECK: bb0([[OUT:%[0-9]+]] : $*Optional<Optional<Wrapped>>, [[SELF_META:%[0-9]+]] : $@thin Optional<Wrapped>.Type):
61
+ // CHECK-NEXT: [[SELF_BOX:%[0-9]+]] = alloc_box $<τ_0_0> { var Optional<τ_0_0> } <Wrapped>, var
62
+ // CHECK-NEXT: [[MARKED_SELF_BOX:%[0-9]+]] = mark_uninitialized [delegatingself] [[SELF_BOX]]
63
+ // CHECK-NEXT: [[SELF_LIFETIME:%[0-9]+]] = begin_borrow [lexical] [[MARKED_SELF_BOX]]
64
+ // CHECK-NEXT: [[PB:%[0-9]+]] = project_box [[SELF_LIFETIME]]
65
+ // CHECK: [[OPT_RESULT_ADDR:%[0-9]+]] = alloc_stack $Optional<Optional<Wrapped>>
66
+ // CHECK: [[DELEG_INIT:%[0-9]+]] = function_ref @$sSq24init_delegation_optionalE9failable1xSgSgyt_tcfC
67
+ // CHECK-NEXT: apply [[DELEG_INIT]]<Wrapped>([[OPT_RESULT_ADDR]], [[SELF_META]])
68
+ self . init ( failable1: ( ) )
69
+ // CHECK: [[SELECT:%[0-9]+]] = select_enum_addr [[OPT_RESULT_ADDR]]
70
+ // CHECK-NEXT: cond_br [[SELECT]], [[SOME_BB:bb[0-9]]], [[NONE_BB:bb[0-9]]]
71
+ //
72
+ // CHECK: [[NONE_BB]]:
73
+ // CHECK-NEXT: destroy_addr [[OPT_RESULT_ADDR]]
74
+ // CHECK-NEXT: dealloc_stack [[OPT_RESULT_ADDR]]
75
+ // CHECK-NEXT: br bb3
76
+ //
77
+ // CHECK: [[SOME_BB]]:
78
+ // CHECK-NEXT: [[RESULT_ADDR:%[0-9]+]] = unchecked_take_enum_data_addr [[OPT_RESULT_ADDR]] : {{.*}}, #Optional.some!enumelt
79
+ // CHECK-NEXT: copy_addr [take] [[RESULT_ADDR]] to [[PB]]
80
+ // CHECK-NEXT: dealloc_stack [[OPT_RESULT_ADDR]]
81
+ // CHECK-NEXT: [[OUT_SOME_ADDR:%[0-9]+]] = init_enum_data_addr [[OUT]] : {{.*}}, #Optional.some!enumelt
82
+ // CHECK-NEXT: copy_addr [[PB]] to [initialization] [[OUT_SOME_ADDR]]
83
+ // CHECK-NEXT: inject_enum_addr [[OUT]] : {{.*}}, #Optional.some!enumelt
84
+ // CHECK-NEXT: end_borrow [[SELF_LIFETIME]]
85
+ // CHECK-NEXT: destroy_value [[MARKED_SELF_BOX]]
86
+ // CHECK-NEXT: br bb4
87
+ //
88
+ // CHECK: bb3:
89
+ // CHECK-NEXT: end_borrow [[SELF_LIFETIME]]
90
+ // CHECK-NEXT: destroy_value [[MARKED_SELF_BOX]]
91
+ // CHECK-NEXT: inject_enum_addr [[OUT]] : {{.*}}, #Optional.none!enumelt
92
+ // CHECK-NEXT: br bb4
93
+ //
94
+ // CHECK: bb4:
95
+ // CHECK-NEXT: [[RET:%[0-9]+]] = tuple ()
96
+ // CHECK-NEXT: return [[RET]] : $()
97
+ // CHECK-NEXT: }
98
+ }
99
+ }
100
+
101
+ extension Optional where Wrapped == Optional < Bool > {
102
+ // CHECK-LABEL: sil hidden [ossa] @$sSq24init_delegation_optionalSbSgRszlE13SpecFailable1ABSgSgyt_tcfC
103
+ init ? ( SpecFailable1: ( ) ) {
104
+ // CHECK: bb0([[SELF_META:%[0-9]+]] : $@thin Optional<Optional<Bool>>.Type):
105
+ // CHECK-NEXT: [[SELF_BOX:%[0-9]+]] = alloc_box ${ var Optional<Optional<Bool>> }, var
106
+ // CHECK-NEXT: [[MARKED_SELF_BOX:%[0-9]+]] = mark_uninitialized [delegatingself] [[SELF_BOX]]
107
+ // CHECK-NEXT: [[SELF_LIFETIME:%[0-9]+]] = begin_borrow [lexical] [[MARKED_SELF_BOX]]
108
+ // CHECK-NEXT: [[PB:%[0-9]+]] = project_box [[SELF_LIFETIME]]
109
+ // CHECK: [[RESULT_ADDR:%[0-9]+]] = alloc_stack $Optional<Optional<Bool>>
110
+ // CHECK: [[DELEG_INIT:%[0-9]+]] = function_ref @$sSq24init_delegation_optionalE12nonFailable1xSgyt_tcfC
111
+ // CHECK-NEXT: apply [[DELEG_INIT]]<Bool?>([[RESULT_ADDR]], [[SELF_META]])
112
+ // CHECK-NEXT: [[RESULT:%[0-9]+]] = load [trivial] [[RESULT_ADDR]]
113
+ // CHECK-NEXT: assign [[RESULT]] to [[PB]]
114
+ // CHECK-NEXT: dealloc_stack [[RESULT_ADDR]]
115
+ // CHECK-NEXT: [[RESULT:%[0-9]+]] = load [trivial] [[PB]]
116
+ // CHECK-NEXT: [[INJECT_INTO_OPT:%[0-9]+]] = enum $Optional<Optional<Optional<Bool>>>, #Optional.some!enumelt, [[RESULT]]
117
+ // CHECK-NEXT: end_borrow [[SELF_LIFETIME]]
118
+ // CHECK-NEXT: destroy_value [[MARKED_SELF_BOX]]
119
+ // CHECK-NEXT: br bb2([[INJECT_INTO_OPT]] : $Optional<Optional<Optional<Bool>>>)
120
+ //
121
+ // FIXME: Dead branch
122
+ // CHECK: bb1:
123
+ //
124
+ // CHECK: bb2([[RET:%[0-9]+]] : $Optional<Optional<Optional<Bool>>>):
125
+ // CHECK-NEXT: return [[RET]]
126
+ // CHECK-NEXT: }
127
+ self . init ( nonFailable1: ( ) )
128
+ }
129
+
130
+ // CHECK-LABEL: sil hidden [ossa] @$sSq24init_delegation_optionalSbSgRszlE13SpecFailable2ABSgSgyt_tcfC
131
+ init ? ( SpecFailable2: ( ) ) {
132
+ // CHECK: bb0([[SELF_META:%[0-9]+]] : $@thin Optional<Optional<Bool>>.Type):
133
+ // CHECK-NEXT: [[SELF_BOX:%[0-9]+]] = alloc_box ${ var Optional<Optional<Bool>> }, var
134
+ // CHECK-NEXT: [[MARKED_SELF_BOX:%[0-9]+]] = mark_uninitialized [delegatingself] [[SELF_BOX]]
135
+ // CHECK-NEXT: [[SELF_LIFETIME:%[0-9]+]] = begin_borrow [lexical] [[MARKED_SELF_BOX]]
136
+ // CHECK-NEXT: [[PB:%[0-9]+]] = project_box [[SELF_LIFETIME]]
137
+ // CHECK: [[DELEG_INIT:%[0-9]+]] = function_ref @$sSq24init_delegation_optionalSbSgRszlE13SpecFailable1ABSgSgyt_tcfC
138
+ // CHECK-NEXT: [[OPT_RESULT:%[0-9]+]] = apply [[DELEG_INIT]]([[SELF_META]])
139
+ // CHECK: [[SELECT:%[0-9]+]] = select_enum [[OPT_RESULT]]
140
+ // CHECK-NEXT: cond_br [[SELECT]], [[SOME_BB:bb[0-9]]], [[NONE_BB:bb[0-9]]]
141
+ //
142
+ // CHECK: [[NONE_BB]]:
143
+ // CHECK-NEXT: br bb3
144
+ //
145
+ // CHECK: [[SOME_BB]]:
146
+ // CHECK-NEXT: [[RESULT:%[0-9]+]] = unchecked_enum_data [[OPT_RESULT]] : {{.*}}, #Optional.some!enumelt
147
+ // CHECK-NEXT: assign [[RESULT]] to [[PB]]
148
+ // CHECK-NEXT: [[RESULT:%[0-9]+]] = load [trivial] [[PB]]
149
+ // CHECK-NEXT: [[INJECT_INTO_OPT:%[0-9]+]] = enum $Optional<Optional<Optional<Bool>>>, #Optional.some!enumelt, [[RESULT]]
150
+ // CHECK-NEXT: end_borrow [[SELF_LIFETIME]]
151
+ // CHECK-NEXT: destroy_value [[MARKED_SELF_BOX]]
152
+ // CHECK-NEXT: br bb4([[INJECT_INTO_OPT]] : $Optional<Optional<Optional<Bool>>>)
153
+ //
154
+ // CHECK: bb3:
155
+ // CHECK-NEXT: end_borrow [[SELF_LIFETIME]]
156
+ // CHECK-NEXT: destroy_value [[MARKED_SELF_BOX]]
157
+ // CHECK-NEXT: [[NIL:%[0-9]+]] = enum $Optional<Optional<Optional<Bool>>>, #Optional.none!enumelt
158
+ // CHECK-NEXT: br bb4([[NIL]] : $Optional<Optional<Optional<Bool>>>)
159
+ //
160
+ // CHECK: bb4([[RET:%[0-9]+]] : $Optional<Optional<Optional<Bool>>>):
161
+ // CHECK-NEXT: return [[RET]]
162
+ // CHECK-NEXT: }
163
+ self . init ( SpecFailable1: ( ) )
164
+ }
28
165
}
0 commit comments