@@ -871,3 +871,36 @@ exit:
871871 %retval = tuple ()
872872 return %retval : $()
873873}
874+
875+ // Test that we don't crash while attempting to complete reborrow lifetimes.
876+ sil [ossa] @closure_lifetime_fixup_output : $@convention(thin) (@owned NonTrivialStructPair) -> () {
877+ bb0(%pair : @owned $NonTrivialStructPair):
878+ %none = enum $Optional<@callee_guaranteed () -> ()>, #Optional.none!enumelt
879+ %none_borrow = begin_borrow %none : $Optional<@callee_guaranteed () -> ()>
880+ %stack = alloc_stack $NonTrivialStructPair, let, name "job", argno 1
881+ %addr = mark_unresolved_non_copyable_value [consumable_and_assignable] %stack : $*NonTrivialStructPair
882+ store %pair to [init] %addr : $*NonTrivialStructPair
883+ cond_br undef, bb1, bb3
884+
885+ bb1:
886+ end_borrow %none_borrow : $Optional<@callee_guaranteed () -> ()>
887+ %closure = partial_apply [callee_guaranteed] undef() : $@convention(thin) () -> ()
888+ %some = enum $Optional<@callee_guaranteed () -> ()>, #Optional.some!enumelt, %closure : $@callee_guaranteed () -> ()
889+ %some_borrow = begin_borrow %some : $Optional<@callee_guaranteed () -> ()>
890+ br bb2
891+
892+ bb2:
893+ br bb4(%some_borrow : $Optional<@callee_guaranteed () -> ()>, %some : $Optional<@callee_guaranteed () -> ()>)
894+
895+ bb3:
896+ br bb4(%none_borrow : $Optional<@callee_guaranteed () -> ()>, %none : $Optional<@callee_guaranteed () -> ()>)
897+
898+ bb4(%reborrow : @reborrow @guaranteed $Optional<@callee_guaranteed () -> ()>, %maybe : @owned $Optional<@callee_guaranteed () -> ()>):
899+ %borrow = borrowed %reborrow : $Optional<@callee_guaranteed () -> ()> from (%maybe : $Optional<@callee_guaranteed () -> ()>)
900+ destroy_addr %addr : $*NonTrivialStructPair
901+ dealloc_stack %stack : $*NonTrivialStructPair
902+ end_borrow %borrow : $Optional<@callee_guaranteed () -> ()>
903+ destroy_value %maybe : $Optional<@callee_guaranteed () -> ()>
904+ %retval = tuple ()
905+ return %retval : $()
906+ }
0 commit comments