@@ -1758,9 +1758,9 @@ impl<'hir> LoweringContext<'_, 'hir> {
17581758 /// ControlFlow::Break(residual) =>
17591759 /// #[allow(unreachable_code)]
17601760 /// // If there is an enclosing `try {...}`:
1761- /// break 'catch_target Try::from_residual(residual),
1761+ /// absurd( break 'catch_target Try::from_residual(residual) ),
17621762 /// // Otherwise:
1763- /// return Try::from_residual(residual),
1763+ /// absurd( return Try::from_residual(residual) ),
17641764 /// }
17651765 /// ```
17661766 fn lower_expr_try ( & mut self , span : Span , sub_expr : & Expr ) -> hir:: ExprKind < ' hir > {
@@ -1769,6 +1769,13 @@ impl<'hir> LoweringContext<'_, 'hir> {
17691769 span,
17701770 Some ( self . allow_try_trait . clone ( ) ) ,
17711771 ) ;
1772+
1773+ let absurd_allowed_span = self . mark_span_with_reason (
1774+ DesugaringKind :: QuestionMark ,
1775+ span,
1776+ Some ( self . allow_convert_absurd . clone ( ) ) ,
1777+ ) ;
1778+
17721779 let try_span = self . tcx . sess . source_map ( ) . end_point ( span) ;
17731780 let try_span = self . mark_span_with_reason (
17741781 DesugaringKind :: QuestionMark ,
@@ -1810,7 +1817,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
18101817
18111818 // `ControlFlow::Break(residual) =>
18121819 // #[allow(unreachable_code)]
1813- // return Try::from_residual(residual),`
1820+ // absurd( return Try::from_residual(residual) ),`
18141821 let break_arm = {
18151822 let residual_ident = Ident :: with_dummy_span ( sym:: residual) ;
18161823 let ( residual_local, residual_local_nid) = self . pat_ident ( try_span, residual_ident) ;
@@ -1823,20 +1830,27 @@ impl<'hir> LoweringContext<'_, 'hir> {
18231830 ) ;
18241831 let ret_expr = if let Some ( catch_node) = self . catch_scope {
18251832 let target_id = Ok ( self . lower_node_id ( catch_node) ) ;
1826- self . arena . alloc ( self . expr (
1833+ self . expr (
18271834 try_span,
18281835 hir:: ExprKind :: Break (
18291836 hir:: Destination { label : None , target_id } ,
18301837 Some ( from_residual_expr) ,
18311838 ) ,
1832- ) )
1839+ )
18331840 } else {
1834- self . arena . alloc ( self . expr ( try_span, hir:: ExprKind :: Ret ( Some ( from_residual_expr) ) ) )
1841+ self . expr ( try_span, hir:: ExprKind :: Ret ( Some ( from_residual_expr) ) )
18351842 } ;
1836- self . lower_attrs ( ret_expr. hir_id , & attrs) ;
1843+
1844+ let absurd_expr = self . expr_call_lang_item_fn (
1845+ absurd_allowed_span,
1846+ hir:: LangItem :: Absurd ,
1847+ arena_vec ! [ self ; ret_expr] ,
1848+ ) ;
1849+
1850+ self . lower_attrs ( absurd_expr. hir_id , & attrs) ;
18371851
18381852 let break_pat = self . pat_cf_break ( try_span, residual_local) ;
1839- self . arm ( break_pat, ret_expr )
1853+ self . arm ( break_pat, absurd_expr )
18401854 } ;
18411855
18421856 hir:: ExprKind :: Match (
0 commit comments