@@ -414,3 +414,44 @@ bb0(%0 : @owned $C):
414414 store %0 to [init] %4 : $*C
415415 unreachable
416416}
417+
418+ indirect enum IndirectEnumNontrivialPayload {
419+ case c(C)
420+ }
421+
422+ // CHECK-LABEL: sil [ossa] @project_box_owned : {{.*}} {
423+ // CHECK: bb0([[IE:%[^,]+]] :
424+ // CHECK: switch_enum [[IE]]
425+ // CHECK-SAME: case #IndirectEnumNontrivialPayload.c!enumelt: [[ONE_CASE:bb[0-9]+]]
426+ // CHECK: [[ONE_CASE]]([[BOX:%[^,]+]] :
427+ // CHECK: [[C_ADDR:%[^,]+]] = project_box [[BOX]]
428+ // CHECK: [[C:%[^,]+]] = load_borrow [[C_ADDR]]
429+ // CHECK: cond_br undef, {{bb[0-9]+}}, [[BASIC_BLOCK4:bb[0-9]+]]
430+ // CHECK: [[BASIC_BLOCK4]]:
431+ // CHECK: end_borrow [[C]]
432+ // CHECK: destroy_value [[BOX]]
433+ // CHECK: unreachable
434+ // CHECK-LABEL: } // end sil function 'project_box_owned'
435+ sil [ossa] @project_box_owned : $@convention(thin) (@owned IndirectEnumNontrivialPayload) -> () {
436+ entry(%ie : @owned $IndirectEnumNontrivialPayload):
437+ switch_enum %ie : $IndirectEnumNontrivialPayload, case #IndirectEnumNontrivialPayload.c!enumelt: one_case
438+
439+ one_case(%box : @owned ${ var C }):
440+ specify_test "ossa-lifetime-completion %box"
441+ %c_addr = project_box %box : ${ var C }, 0
442+ %c = load_borrow %c_addr : $*C
443+ cond_br undef, left, right
444+
445+ left:
446+ end_borrow %c : $C
447+ destroy_value %box : ${ var C }
448+ br exit
449+
450+ exit:
451+ %retval = tuple ()
452+ return %retval : $()
453+
454+ right:
455+ end_borrow %c : $C
456+ unreachable
457+ }
0 commit comments