@@ -2441,54 +2441,8 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
2441
2441
Ty :: new_error ( tcx, err)
2442
2442
}
2443
2443
hir:: PatKind :: Range ( start, end, include_end) => {
2444
- let expr_to_const = |expr : & ' tcx hir:: PatExpr < ' tcx > | -> ty:: Const < ' tcx > {
2445
- let ( c, c_ty) = match expr. kind {
2446
- hir:: PatExprKind :: Lit { lit, negated } => {
2447
- let lit_input =
2448
- LitToConstInput { lit : & lit. node , ty, neg : negated } ;
2449
- let ct = tcx. lit_to_const ( lit_input) ;
2450
- ( ct, ty)
2451
- }
2452
-
2453
- hir:: PatExprKind :: Path ( hir:: QPath :: Resolved (
2454
- _,
2455
- path @ & hir:: Path {
2456
- res : Res :: Def ( DefKind :: ConstParam , def_id) ,
2457
- ..
2458
- } ,
2459
- ) ) => {
2460
- match self . prohibit_generic_args (
2461
- path. segments . iter ( ) ,
2462
- GenericsArgsErrExtend :: Param ( def_id) ,
2463
- ) {
2464
- Ok ( ( ) ) => {
2465
- let ty = tcx
2466
- . type_of ( def_id)
2467
- . no_bound_vars ( )
2468
- . expect ( "const parameter types cannot be generic" ) ;
2469
- let ct = self . lower_const_param ( def_id, expr. hir_id ) ;
2470
- ( ct, ty)
2471
- }
2472
- Err ( guar) => (
2473
- ty:: Const :: new_error ( tcx, guar) ,
2474
- Ty :: new_error ( tcx, guar) ,
2475
- ) ,
2476
- }
2477
- }
2478
-
2479
- _ => {
2480
- let err = tcx
2481
- . dcx ( )
2482
- . emit_err ( crate :: errors:: NonConstRange { span : expr. span } ) ;
2483
- ( ty:: Const :: new_error ( tcx, err) , Ty :: new_error ( tcx, err) )
2484
- }
2485
- } ;
2486
- self . record_ty ( expr. hir_id , c_ty, expr. span ) ;
2487
- c
2488
- } ;
2489
-
2490
- let start = start. map ( expr_to_const) ;
2491
- let end = end. map ( expr_to_const) ;
2444
+ let start = start. map ( |expr| self . lower_pat_expr ( expr, ty) ) ;
2445
+ let end = end. map ( |expr| self . lower_pat_expr ( expr, ty) ) ;
2492
2446
2493
2447
let include_end = match include_end {
2494
2448
hir:: RangeEnd :: Included => true ,
@@ -2515,6 +2469,44 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
2515
2469
result_ty
2516
2470
}
2517
2471
2472
+ fn lower_pat_expr ( & self , expr : & ' tcx hir:: PatExpr < ' tcx > , ty : Ty < ' tcx > ) -> ty:: Const < ' tcx > {
2473
+ let tcx = self . tcx ( ) ;
2474
+ let ( c, c_ty) = match expr. kind {
2475
+ hir:: PatExprKind :: Lit { lit, negated } => {
2476
+ let lit_input = LitToConstInput { lit : & lit. node , ty, neg : negated } ;
2477
+ let ct = tcx. lit_to_const ( lit_input) ;
2478
+ ( ct, ty)
2479
+ }
2480
+
2481
+ hir:: PatExprKind :: Path ( hir:: QPath :: Resolved (
2482
+ _,
2483
+ path @ & hir:: Path { res : Res :: Def ( DefKind :: ConstParam , def_id) , .. } ,
2484
+ ) ) => {
2485
+ match self . prohibit_generic_args (
2486
+ path. segments . iter ( ) ,
2487
+ GenericsArgsErrExtend :: Param ( def_id) ,
2488
+ ) {
2489
+ Ok ( ( ) ) => {
2490
+ let ty = tcx
2491
+ . type_of ( def_id)
2492
+ . no_bound_vars ( )
2493
+ . expect ( "const parameter types cannot be generic" ) ;
2494
+ let ct = self . lower_const_param ( def_id, expr. hir_id ) ;
2495
+ ( ct, ty)
2496
+ }
2497
+ Err ( guar) => ( ty:: Const :: new_error ( tcx, guar) , Ty :: new_error ( tcx, guar) ) ,
2498
+ }
2499
+ }
2500
+
2501
+ _ => {
2502
+ let err = tcx. dcx ( ) . emit_err ( crate :: errors:: NonConstRange { span : expr. span } ) ;
2503
+ ( ty:: Const :: new_error ( tcx, err) , Ty :: new_error ( tcx, err) )
2504
+ }
2505
+ } ;
2506
+ self . record_ty ( expr. hir_id , c_ty, expr. span ) ;
2507
+ c
2508
+ }
2509
+
2518
2510
/// Lower an opaque type (i.e., an existential impl-Trait type) from the HIR.
2519
2511
#[ instrument( level = "debug" , skip( self ) , ret) ]
2520
2512
fn lower_opaque_ty ( & self , def_id : LocalDefId , in_trait : bool ) -> Ty < ' tcx > {
0 commit comments