@@ -1758,9 +1758,9 @@ impl<'hir> LoweringContext<'_, 'hir> {
1758
1758
/// ControlFlow::Break(residual) =>
1759
1759
/// #[allow(unreachable_code)]
1760
1760
/// // If there is an enclosing `try {...}`:
1761
- /// break 'catch_target Try::from_residual(residual),
1761
+ /// absurd( break 'catch_target Try::from_residual(residual) ),
1762
1762
/// // Otherwise:
1763
- /// return Try::from_residual(residual),
1763
+ /// absurd( return Try::from_residual(residual) ),
1764
1764
/// }
1765
1765
/// ```
1766
1766
fn lower_expr_try ( & mut self , span : Span , sub_expr : & Expr ) -> hir:: ExprKind < ' hir > {
@@ -1769,6 +1769,13 @@ impl<'hir> LoweringContext<'_, 'hir> {
1769
1769
span,
1770
1770
Some ( self . allow_try_trait . clone ( ) ) ,
1771
1771
) ;
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
+
1772
1779
let try_span = self . tcx . sess . source_map ( ) . end_point ( span) ;
1773
1780
let try_span = self . mark_span_with_reason (
1774
1781
DesugaringKind :: QuestionMark ,
@@ -1810,7 +1817,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
1810
1817
1811
1818
// `ControlFlow::Break(residual) =>
1812
1819
// #[allow(unreachable_code)]
1813
- // return Try::from_residual(residual),`
1820
+ // absurd( return Try::from_residual(residual) ),`
1814
1821
let break_arm = {
1815
1822
let residual_ident = Ident :: with_dummy_span ( sym:: residual) ;
1816
1823
let ( residual_local, residual_local_nid) = self . pat_ident ( try_span, residual_ident) ;
@@ -1823,20 +1830,27 @@ impl<'hir> LoweringContext<'_, 'hir> {
1823
1830
) ;
1824
1831
let ret_expr = if let Some ( catch_node) = self . catch_scope {
1825
1832
let target_id = Ok ( self . lower_node_id ( catch_node) ) ;
1826
- self . arena . alloc ( self . expr (
1833
+ self . expr (
1827
1834
try_span,
1828
1835
hir:: ExprKind :: Break (
1829
1836
hir:: Destination { label : None , target_id } ,
1830
1837
Some ( from_residual_expr) ,
1831
1838
) ,
1832
- ) )
1839
+ )
1833
1840
} 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) ) )
1835
1842
} ;
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) ;
1837
1851
1838
1852
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 )
1840
1854
} ;
1841
1855
1842
1856
hir:: ExprKind :: Match (
0 commit comments