@@ -25,4 +25,141 @@ extension Optional {
2525 // CHECK-NEXT: return [[RET]] : $()
2626 // CHECK-NEXT: }
2727 }
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+ }
28165}
0 commit comments