@@ -533,43 +533,64 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> {
533
533
}
534
534
}
535
535
536
+ /// Converts inline const patterns.
537
+ fn lower_inline_const (
538
+ & mut self ,
539
+ anon_const : & ' tcx hir:: AnonConst ,
540
+ id : hir:: HirId ,
541
+ span : Span ,
542
+ ) -> PatKind < ' tcx > {
543
+ let anon_const_def_id = self . tcx . hir ( ) . local_def_id ( anon_const. hir_id ) ;
544
+ let value = ty:: Const :: from_inline_const ( self . tcx , anon_const_def_id) ;
545
+
546
+ // Evaluate early like we do in `lower_path`.
547
+ let value = value. eval ( self . tcx , self . param_env ) ;
548
+
549
+ match value. val {
550
+ ConstKind :: Param ( _) => {
551
+ self . errors . push ( PatternError :: ConstParamInPattern ( span) ) ;
552
+ return PatKind :: Wild ;
553
+ }
554
+ ConstKind :: Unevaluated ( _) => {
555
+ // If we land here it means the const can't be evaluated because it's `TooGeneric`.
556
+ self . tcx . sess . span_err ( span, "constant pattern depends on a generic parameter" ) ;
557
+ return PatKind :: Wild ;
558
+ }
559
+ _ => ( ) ,
560
+ }
561
+
562
+ * self . const_to_pat ( value, id, span, false ) . kind
563
+ }
564
+
536
565
/// Converts literals, paths and negation of literals to patterns.
537
566
/// The special case for negation exists to allow things like `-128_i8`
538
567
/// which would overflow if we tried to evaluate `128_i8` and then negate
539
568
/// afterwards.
540
569
fn lower_lit ( & mut self , expr : & ' tcx hir:: Expr < ' tcx > ) -> PatKind < ' tcx > {
541
- if let hir:: ExprKind :: Path ( ref qpath) = expr. kind {
542
- * self . lower_path ( qpath, expr. hir_id , expr. span ) . kind
543
- } else {
544
- let ( lit, neg) = match expr. kind {
545
- hir:: ExprKind :: ConstBlock ( ref anon_const) => {
546
- let anon_const_def_id = self . tcx . hir ( ) . local_def_id ( anon_const. hir_id ) ;
547
- let value = ty:: Const :: from_inline_const ( self . tcx , anon_const_def_id) ;
548
- if matches ! ( value. val, ConstKind :: Param ( _) ) {
549
- let span = self . tcx . hir ( ) . span ( anon_const. hir_id ) ;
550
- self . errors . push ( PatternError :: ConstParamInPattern ( span) ) ;
551
- return PatKind :: Wild ;
552
- }
553
- return * self . const_to_pat ( value, expr. hir_id , expr. span , false ) . kind ;
554
- }
555
- hir:: ExprKind :: Lit ( ref lit) => ( lit, false ) ,
556
- hir:: ExprKind :: Unary ( hir:: UnOp :: Neg , ref expr) => {
557
- let lit = match expr. kind {
558
- hir:: ExprKind :: Lit ( ref lit) => lit,
559
- _ => span_bug ! ( expr. span, "not a literal: {:?}" , expr) ,
560
- } ;
561
- ( lit, true )
562
- }
563
- _ => span_bug ! ( expr. span, "not a literal: {:?}" , expr) ,
564
- } ;
565
-
566
- let lit_input =
567
- LitToConstInput { lit : & lit. node , ty : self . typeck_results . expr_ty ( expr) , neg } ;
568
- match self . tcx . at ( expr. span ) . lit_to_const ( lit_input) {
569
- Ok ( val) => * self . const_to_pat ( val, expr. hir_id , lit. span , false ) . kind ,
570
- Err ( LitToConstError :: Reported ) => PatKind :: Wild ,
571
- Err ( LitToConstError :: TypeError ) => bug ! ( "lower_lit: had type error" ) ,
570
+ let ( lit, neg) = match expr. kind {
571
+ hir:: ExprKind :: Path ( ref qpath) => {
572
+ return * self . lower_path ( qpath, expr. hir_id , expr. span ) . kind ;
573
+ }
574
+ hir:: ExprKind :: ConstBlock ( ref anon_const) => {
575
+ return self . lower_inline_const ( anon_const, expr. hir_id , expr. span ) ;
576
+ }
577
+ hir:: ExprKind :: Lit ( ref lit) => ( lit, false ) ,
578
+ hir:: ExprKind :: Unary ( hir:: UnOp :: Neg , ref expr) => {
579
+ let lit = match expr. kind {
580
+ hir:: ExprKind :: Lit ( ref lit) => lit,
581
+ _ => span_bug ! ( expr. span, "not a literal: {:?}" , expr) ,
582
+ } ;
583
+ ( lit, true )
572
584
}
585
+ _ => span_bug ! ( expr. span, "not a literal: {:?}" , expr) ,
586
+ } ;
587
+
588
+ let lit_input =
589
+ LitToConstInput { lit : & lit. node , ty : self . typeck_results . expr_ty ( expr) , neg } ;
590
+ match self . tcx . at ( expr. span ) . lit_to_const ( lit_input) {
591
+ Ok ( val) => * self . const_to_pat ( val, expr. hir_id , lit. span , false ) . kind ,
592
+ Err ( LitToConstError :: Reported ) => PatKind :: Wild ,
593
+ Err ( LitToConstError :: TypeError ) => bug ! ( "lower_lit: had type error" ) ,
573
594
}
574
595
}
575
596
}
0 commit comments