@@ -1148,3 +1148,56 @@ func testUninhabitedSwitchScrutinee() {
1148
1148
switch myFatalError ( ) { }
1149
1149
}
1150
1150
}
1151
+
1152
+ // Make sure that we properly can handle address only tuples with loadable
1153
+ // subtypes.
1154
+ class Klass { }
1155
+
1156
+ enum TrivialSingleCaseEnum {
1157
+ case a
1158
+ }
1159
+
1160
+ enum NonTrivialSingleCaseEnum {
1161
+ case a( Klass )
1162
+ }
1163
+
1164
+ // CHECK-LABEL: sil hidden @$s6switch33address_only_with_trivial_subtypeyyAA21TrivialSingleCaseEnumO_yptF : $@convention(thin) (TrivialSingleCaseEnum, @in_guaranteed Any) -> () {
1165
+ // CHECK: [[MEM:%.*]] = alloc_stack $(TrivialSingleCaseEnum, Any)
1166
+ // CHECK: [[INIT_TUP_0:%.*]] = tuple_element_addr [[MEM]] : $*(TrivialSingleCaseEnum, Any), 0
1167
+ // CHECK: [[INIT_TUP_1:%.*]] = tuple_element_addr [[MEM]] : $*(TrivialSingleCaseEnum, Any), 1
1168
+ // CHECK: store {{%.*}} to [trivial] [[INIT_TUP_0]]
1169
+ // CHECK: copy_addr [take] {{%.*}} to [initialization] [[INIT_TUP_1]]
1170
+ // CHECK: [[TUP_0:%.*]] = tuple_element_addr [[MEM]] : $*(TrivialSingleCaseEnum, Any), 0
1171
+ // CHECK: [[TUP_0_VAL:%.*]] = load [trivial] [[TUP_0]]
1172
+ // CHECK: [[TUP_1:%.*]] = tuple_element_addr [[MEM]] : $*(TrivialSingleCaseEnum, Any), 1
1173
+ // CHECK: switch_enum [[TUP_0_VAL]]
1174
+ //
1175
+ // CHECK: } // end sil function '$s6switch33address_only_with_trivial_subtypeyyAA21TrivialSingleCaseEnumO_yptF'
1176
+ func address_only_with_trivial_subtype( _ a: TrivialSingleCaseEnum , _ value: Any ) {
1177
+ switch ( a, value) {
1178
+ case ( . a, _) :
1179
+ break
1180
+ default :
1181
+ break
1182
+ }
1183
+ }
1184
+
1185
+ // CHECK-LABEL: sil hidden @$s6switch36address_only_with_nontrivial_subtypeyyAA24NonTrivialSingleCaseEnumO_yptF : $@convention(thin) (@guaranteed NonTrivialSingleCaseEnum, @in_guaranteed Any) -> () {
1186
+ // CHECK: [[MEM:%.*]] = alloc_stack $(NonTrivialSingleCaseEnum, Any)
1187
+ // CHECK: [[INIT_TUP_0:%.*]] = tuple_element_addr [[MEM]] : $*(NonTrivialSingleCaseEnum, Any), 0
1188
+ // CHECK: [[INIT_TUP_1:%.*]] = tuple_element_addr [[MEM]] : $*(NonTrivialSingleCaseEnum, Any), 1
1189
+ // CHECK: store {{%.*}} to [init] [[INIT_TUP_0]]
1190
+ // CHECK: copy_addr [take] {{%.*}} to [initialization] [[INIT_TUP_1]]
1191
+ // CHECK: [[TUP_0:%.*]] = tuple_element_addr [[MEM]] : $*(NonTrivialSingleCaseEnum, Any), 0
1192
+ // CHECK: [[TUP_0_VAL:%.*]] = load_borrow [[TUP_0]]
1193
+ // CHECK: [[TUP_1:%.*]] = tuple_element_addr [[MEM]] : $*(NonTrivialSingleCaseEnum, Any), 1
1194
+ // CHECK: switch_enum [[TUP_0_VAL]]
1195
+ // CHECK: } // end sil function '$s6switch36address_only_with_nontrivial_subtypeyyAA24NonTrivialSingleCaseEnumO_yptF'
1196
+ func address_only_with_nontrivial_subtype( _ a: NonTrivialSingleCaseEnum , _ value: Any ) {
1197
+ switch ( a, value) {
1198
+ case ( . a, _) :
1199
+ break
1200
+ default :
1201
+ break
1202
+ }
1203
+ }
0 commit comments