@@ -620,38 +620,36 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, '
620620 op : & OpTy < ' tcx , M :: PointerTag > ,
621621 scalar_layout : & ScalarAbi ,
622622 ) -> InterpResult < ' tcx > {
623- let value = self . read_scalar ( op) ?;
624- let valid_range = scalar_layout. valid_range . clone ( ) ;
625- let WrappingRange { start : lo, end : hi } = valid_range;
626- // Determine the allowed range
627- // `max_hi` is as big as the size fits
628- let max_hi = u128:: MAX >> ( 128 - op. layout . size . bits ( ) ) ;
629- assert ! ( hi <= max_hi) ;
630- // We could also write `(hi + 1) % (max_hi + 1) == lo` but `max_hi + 1` overflows for `u128`
631- if ( lo == 0 && hi == max_hi) || ( hi + 1 == lo) {
623+ if scalar_layout. valid_range . is_full_for ( op. layout . size ) {
632624 // Nothing to check
633625 return Ok ( ( ) ) ;
634626 }
635- // At least one value is excluded. Get the bits.
627+ // At least one value is excluded.
628+ let valid_range = scalar_layout. valid_range . clone ( ) ;
629+ let WrappingRange { start, end } = valid_range;
630+ let max_value = u128:: MAX >> ( 128 - op. layout . size . bits ( ) ) ;
631+ assert ! ( end <= max_value) ;
632+ // Determine the allowed range
633+ let value = self . read_scalar ( op) ?;
636634 let value = try_validation ! (
637635 value. check_init( ) ,
638636 self . path,
639637 err_ub!( InvalidUninitBytes ( None ) ) => { "{}" , value }
640- expected { "something {}" , wrapping_range_format( valid_range, max_hi ) } ,
638+ expected { "something {}" , wrapping_range_format( valid_range, max_value ) } ,
641639 ) ;
642640 let bits = match value. try_to_int ( ) {
643641 Err ( _) => {
644642 // So this is a pointer then, and casting to an int failed.
645643 // Can only happen during CTFE.
646644 let ptr = self . ecx . scalar_to_ptr ( value) ;
647- if lo == 1 && hi == max_hi {
645+ if start == 1 && end == max_value {
648646 // Only null is the niche. So make sure the ptr is NOT null.
649647 if self . ecx . memory . ptr_may_be_null ( ptr) {
650648 throw_validation_failure ! ( self . path,
651649 { "a potentially null pointer" }
652650 expected {
653651 "something that cannot possibly fail to be {}" ,
654- wrapping_range_format( valid_range, max_hi )
652+ wrapping_range_format( valid_range, max_value )
655653 }
656654 )
657655 }
@@ -663,7 +661,7 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, '
663661 { "a pointer" }
664662 expected {
665663 "something that cannot possibly fail to be {}" ,
666- wrapping_range_format( valid_range, max_hi )
664+ wrapping_range_format( valid_range, max_value )
667665 }
668666 )
669667 }
@@ -676,7 +674,7 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, '
676674 } else {
677675 throw_validation_failure ! ( self . path,
678676 { "{}" , bits }
679- expected { "something {}" , wrapping_range_format( valid_range, max_hi ) }
677+ expected { "something {}" , wrapping_range_format( valid_range, max_value ) }
680678 )
681679 }
682680 }
0 commit comments