@@ -543,54 +543,47 @@ pub fn eval_const_expr_partial<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
543
543
let result = match e. node {
544
544
hir:: ExprUnary ( hir:: UnNeg , ref inner) => {
545
545
// unary neg literals already got their sign during creation
546
- match inner. node {
547
- hir:: ExprLit ( ref lit) => {
548
- use syntax:: ast:: * ;
549
- use syntax:: ast:: LitIntType :: * ;
550
- const I8_OVERFLOW : u64 = :: std:: i8:: MAX as u64 + 1 ;
551
- const I16_OVERFLOW : u64 = :: std:: i16:: MAX as u64 + 1 ;
552
- const I32_OVERFLOW : u64 = :: std:: i32:: MAX as u64 + 1 ;
553
- const I64_OVERFLOW : u64 = :: std:: i64:: MAX as u64 + 1 ;
554
- match ( & lit. node , ety. map ( |t| & t. sty ) ) {
555
- ( & LitKind :: Int ( I8_OVERFLOW , Unsuffixed ) , Some ( & ty:: TyInt ( IntTy :: I8 ) ) ) |
556
- ( & LitKind :: Int ( I8_OVERFLOW , Signed ( IntTy :: I8 ) ) , _) => {
557
- return Ok ( Integral ( I8 ( :: std:: i8:: MIN ) ) )
558
- } ,
559
- ( & LitKind :: Int ( I16_OVERFLOW , Unsuffixed ) , Some ( & ty:: TyInt ( IntTy :: I16 ) ) ) |
560
- ( & LitKind :: Int ( I16_OVERFLOW , Signed ( IntTy :: I16 ) ) , _) => {
561
- return Ok ( Integral ( I16 ( :: std:: i16:: MIN ) ) )
562
- } ,
563
- ( & LitKind :: Int ( I32_OVERFLOW , Unsuffixed ) , Some ( & ty:: TyInt ( IntTy :: I32 ) ) ) |
564
- ( & LitKind :: Int ( I32_OVERFLOW , Signed ( IntTy :: I32 ) ) , _) => {
565
- return Ok ( Integral ( I32 ( :: std:: i32:: MIN ) ) )
566
- } ,
567
- ( & LitKind :: Int ( I64_OVERFLOW , Unsuffixed ) , Some ( & ty:: TyInt ( IntTy :: I64 ) ) ) |
568
- ( & LitKind :: Int ( I64_OVERFLOW , Signed ( IntTy :: I64 ) ) , _) => {
569
- return Ok ( Integral ( I64 ( :: std:: i64:: MIN ) ) )
570
- } ,
571
- ( & LitKind :: Int ( n, Unsuffixed ) , Some ( & ty:: TyInt ( IntTy :: Is ) ) ) |
572
- ( & LitKind :: Int ( n, Signed ( IntTy :: Is ) ) , _) => {
573
- match tcx. sess . target . int_type {
574
- IntTy :: I16 => if n == I16_OVERFLOW {
575
- return Ok ( Integral ( Isize ( Is16 ( :: std:: i16:: MIN ) ) ) ) ;
576
- } ,
577
- IntTy :: I32 => if n == I32_OVERFLOW {
578
- return Ok ( Integral ( Isize ( Is32 ( :: std:: i32:: MIN ) ) ) ) ;
579
- } ,
580
- IntTy :: I64 => if n == I64_OVERFLOW {
581
- return Ok ( Integral ( Isize ( Is64 ( :: std:: i64:: MIN ) ) ) ) ;
582
- } ,
583
- _ => bug ! ( ) ,
584
- }
585
- } ,
586
- _ => { } ,
587
- }
588
- } ,
589
- hir:: ExprUnary ( hir:: UnNeg , ref inner) => {
590
- // skip `--$expr`
591
- return eval_const_expr_partial ( tcx, inner, ty_hint, fn_args) ;
592
- } ,
593
- _ => { } ,
546
+ if let hir:: ExprLit ( ref lit) = inner. node {
547
+ use syntax:: ast:: * ;
548
+ use syntax:: ast:: LitIntType :: * ;
549
+ const I8_OVERFLOW : u64 = :: std:: i8:: MAX as u64 + 1 ;
550
+ const I16_OVERFLOW : u64 = :: std:: i16:: MAX as u64 + 1 ;
551
+ const I32_OVERFLOW : u64 = :: std:: i32:: MAX as u64 + 1 ;
552
+ const I64_OVERFLOW : u64 = :: std:: i64:: MAX as u64 + 1 ;
553
+ match ( & lit. node , ety. map ( |t| & t. sty ) ) {
554
+ ( & LitKind :: Int ( I8_OVERFLOW , Unsuffixed ) , Some ( & ty:: TyInt ( IntTy :: I8 ) ) ) |
555
+ ( & LitKind :: Int ( I8_OVERFLOW , Signed ( IntTy :: I8 ) ) , _) => {
556
+ return Ok ( Integral ( I8 ( :: std:: i8:: MIN ) ) )
557
+ } ,
558
+ ( & LitKind :: Int ( I16_OVERFLOW , Unsuffixed ) , Some ( & ty:: TyInt ( IntTy :: I16 ) ) ) |
559
+ ( & LitKind :: Int ( I16_OVERFLOW , Signed ( IntTy :: I16 ) ) , _) => {
560
+ return Ok ( Integral ( I16 ( :: std:: i16:: MIN ) ) )
561
+ } ,
562
+ ( & LitKind :: Int ( I32_OVERFLOW , Unsuffixed ) , Some ( & ty:: TyInt ( IntTy :: I32 ) ) ) |
563
+ ( & LitKind :: Int ( I32_OVERFLOW , Signed ( IntTy :: I32 ) ) , _) => {
564
+ return Ok ( Integral ( I32 ( :: std:: i32:: MIN ) ) )
565
+ } ,
566
+ ( & LitKind :: Int ( I64_OVERFLOW , Unsuffixed ) , Some ( & ty:: TyInt ( IntTy :: I64 ) ) ) |
567
+ ( & LitKind :: Int ( I64_OVERFLOW , Signed ( IntTy :: I64 ) ) , _) => {
568
+ return Ok ( Integral ( I64 ( :: std:: i64:: MIN ) ) )
569
+ } ,
570
+ ( & LitKind :: Int ( n, Unsuffixed ) , Some ( & ty:: TyInt ( IntTy :: Is ) ) ) |
571
+ ( & LitKind :: Int ( n, Signed ( IntTy :: Is ) ) , _) => {
572
+ match tcx. sess . target . int_type {
573
+ IntTy :: I16 => if n == I16_OVERFLOW {
574
+ return Ok ( Integral ( Isize ( Is16 ( :: std:: i16:: MIN ) ) ) ) ;
575
+ } ,
576
+ IntTy :: I32 => if n == I32_OVERFLOW {
577
+ return Ok ( Integral ( Isize ( Is32 ( :: std:: i32:: MIN ) ) ) ) ;
578
+ } ,
579
+ IntTy :: I64 => if n == I64_OVERFLOW {
580
+ return Ok ( Integral ( Isize ( Is64 ( :: std:: i64:: MIN ) ) ) ) ;
581
+ } ,
582
+ _ => bug ! ( ) ,
583
+ }
584
+ } ,
585
+ _ => { } ,
586
+ }
594
587
}
595
588
match eval_const_expr_partial ( tcx, & inner, ty_hint, fn_args) ? {
596
589
Float ( f) => Float ( -f) ,
0 commit comments