@@ -562,44 +562,51 @@ pub fn eval_const_expr_partial<'tcx>(tcx: &TyCtxt<'tcx>,
562
562
let result = match e. node {
563
563
hir:: ExprUnary ( hir:: UnNeg , ref inner) => {
564
564
// unary neg literals already got their sign during creation
565
- if let hir:: ExprLit ( ref lit) = inner. node {
566
- use syntax:: ast:: * ;
567
- use syntax:: ast:: LitIntType :: * ;
568
- const I8_OVERFLOW : u64 = :: std:: i8:: MAX as u64 + 1 ;
569
- const I16_OVERFLOW : u64 = :: std:: i16:: MAX as u64 + 1 ;
570
- const I32_OVERFLOW : u64 = :: std:: i32:: MAX as u64 + 1 ;
571
- const I64_OVERFLOW : u64 = :: std:: i64:: MAX as u64 + 1 ;
572
- match ( & lit. node , ety. map ( |t| & t. sty ) ) {
573
- ( & LitKind :: Int ( I8_OVERFLOW , Unsuffixed ) , Some ( & ty:: TyInt ( IntTy :: I8 ) ) ) |
574
- ( & LitKind :: Int ( I8_OVERFLOW , Signed ( IntTy :: I8 ) ) , _) => {
575
- return Ok ( Integral ( I8 ( :: std:: i8:: MIN ) ) )
576
- } ,
577
- ( & LitKind :: Int ( I16_OVERFLOW , Unsuffixed ) , Some ( & ty:: TyInt ( IntTy :: I16 ) ) ) |
578
- ( & LitKind :: Int ( I16_OVERFLOW , Signed ( IntTy :: I16 ) ) , _) => {
579
- return Ok ( Integral ( I16 ( :: std:: i16:: MIN ) ) )
580
- } ,
581
- ( & LitKind :: Int ( I32_OVERFLOW , Unsuffixed ) , Some ( & ty:: TyInt ( IntTy :: I32 ) ) ) |
582
- ( & LitKind :: Int ( I32_OVERFLOW , Signed ( IntTy :: I32 ) ) , _) => {
583
- return Ok ( Integral ( I32 ( :: std:: i32:: MIN ) ) )
584
- } ,
585
- ( & LitKind :: Int ( I64_OVERFLOW , Unsuffixed ) , Some ( & ty:: TyInt ( IntTy :: I64 ) ) ) |
586
- ( & LitKind :: Int ( I64_OVERFLOW , Signed ( IntTy :: I64 ) ) , _) => {
587
- return Ok ( Integral ( I64 ( :: std:: i64:: MIN ) ) )
588
- } ,
589
- ( & LitKind :: Int ( n, Unsuffixed ) , Some ( & ty:: TyInt ( IntTy :: Is ) ) ) |
590
- ( & LitKind :: Int ( n, Signed ( IntTy :: Is ) ) , _) => {
591
- match tcx. sess . target . int_type {
592
- IntTy :: I32 => if n == I32_OVERFLOW {
593
- return Ok ( Integral ( Isize ( Is32 ( :: std:: i32:: MIN ) ) ) ) ;
594
- } ,
595
- IntTy :: I64 => if n == I64_OVERFLOW {
596
- return Ok ( Integral ( Isize ( Is64 ( :: std:: i64:: MIN ) ) ) ) ;
597
- } ,
598
- _ => bug ! ( ) ,
599
- }
600
- } ,
601
- _ => { } ,
602
- }
565
+ match inner. node {
566
+ hir:: ExprLit ( ref lit) => {
567
+ use syntax:: ast:: * ;
568
+ use syntax:: ast:: LitIntType :: * ;
569
+ const I8_OVERFLOW : u64 = :: std:: i8:: MAX as u64 + 1 ;
570
+ const I16_OVERFLOW : u64 = :: std:: i16:: MAX as u64 + 1 ;
571
+ const I32_OVERFLOW : u64 = :: std:: i32:: MAX as u64 + 1 ;
572
+ const I64_OVERFLOW : u64 = :: std:: i64:: MAX as u64 + 1 ;
573
+ match ( & lit. node , ety. map ( |t| & t. sty ) ) {
574
+ ( & LitKind :: Int ( I8_OVERFLOW , Unsuffixed ) , Some ( & ty:: TyInt ( IntTy :: I8 ) ) ) |
575
+ ( & LitKind :: Int ( I8_OVERFLOW , Signed ( IntTy :: I8 ) ) , _) => {
576
+ return Ok ( Integral ( I8 ( :: std:: i8:: MIN ) ) )
577
+ } ,
578
+ ( & LitKind :: Int ( I16_OVERFLOW , Unsuffixed ) , Some ( & ty:: TyInt ( IntTy :: I16 ) ) ) |
579
+ ( & LitKind :: Int ( I16_OVERFLOW , Signed ( IntTy :: I16 ) ) , _) => {
580
+ return Ok ( Integral ( I16 ( :: std:: i16:: MIN ) ) )
581
+ } ,
582
+ ( & LitKind :: Int ( I32_OVERFLOW , Unsuffixed ) , Some ( & ty:: TyInt ( IntTy :: I32 ) ) ) |
583
+ ( & LitKind :: Int ( I32_OVERFLOW , Signed ( IntTy :: I32 ) ) , _) => {
584
+ return Ok ( Integral ( I32 ( :: std:: i32:: MIN ) ) )
585
+ } ,
586
+ ( & LitKind :: Int ( I64_OVERFLOW , Unsuffixed ) , Some ( & ty:: TyInt ( IntTy :: I64 ) ) ) |
587
+ ( & LitKind :: Int ( I64_OVERFLOW , Signed ( IntTy :: I64 ) ) , _) => {
588
+ return Ok ( Integral ( I64 ( :: std:: i64:: MIN ) ) )
589
+ } ,
590
+ ( & LitKind :: Int ( n, Unsuffixed ) , Some ( & ty:: TyInt ( IntTy :: Is ) ) ) |
591
+ ( & LitKind :: Int ( n, Signed ( IntTy :: Is ) ) , _) => {
592
+ match tcx. sess . target . int_type {
593
+ IntTy :: I32 => if n == I32_OVERFLOW {
594
+ return Ok ( Integral ( Isize ( Is32 ( :: std:: i32:: MIN ) ) ) ) ;
595
+ } ,
596
+ IntTy :: I64 => if n == I64_OVERFLOW {
597
+ return Ok ( Integral ( Isize ( Is64 ( :: std:: i64:: MIN ) ) ) ) ;
598
+ } ,
599
+ _ => bug ! ( ) ,
600
+ }
601
+ } ,
602
+ _ => { } ,
603
+ }
604
+ } ,
605
+ hir:: ExprUnary ( hir:: UnNeg , ref inner) => {
606
+ // skip `--$expr`
607
+ return eval_const_expr_partial ( tcx, inner, ty_hint, fn_args) ;
608
+ } ,
609
+ _ => { } ,
603
610
}
604
611
match eval_const_expr_partial ( tcx, & inner, ty_hint, fn_args) ? {
605
612
Float ( f) => Float ( -f) ,
0 commit comments