@@ -871,3 +871,36 @@ exit:
871
871
%retval = tuple ()
872
872
return %retval : $()
873
873
}
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