mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 04:57:19 +00:00 
			
		
		
		
	 5039160c5b
			
		
	
	
		5039160c5b
		
	
	
	
	
		
			
			This mitigates the perf impact of enabling overflow checks on rustc. The change to use overflow checks will be done in a later PR.
		
			
				
	
	
		
			66 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| // This would belong to `rustc_data_structures`, but `rustc_serialize` needs it too.
 | |
| 
 | |
| /// Addition, but only overflow checked when `cfg(debug_assertions)` is set
 | |
| /// instead of respecting `-Coverflow-checks`.
 | |
| ///
 | |
| /// This exists for performance reasons, as we ship rustc with overflow checks.
 | |
| /// While overflow checks are perf neutral in almost all of the compiler, there
 | |
| /// are a few particularly hot areas where we don't want overflow checks in our
 | |
| /// dist builds. Overflow is still a bug there, so we want overflow check for
 | |
| /// builds with debug assertions.
 | |
| ///
 | |
| /// That's a long way to say that this should be used in areas where overflow
 | |
| /// is a bug but overflow checking is too slow.
 | |
| pub trait DebugStrictAdd {
 | |
|     /// See [`DebugStrictAdd`].
 | |
|     fn debug_strict_add(self, other: Self) -> Self;
 | |
| }
 | |
| 
 | |
| macro_rules! impl_debug_strict_add {
 | |
|     ($( $ty:ty )*) => {
 | |
|         $(
 | |
|             impl DebugStrictAdd for $ty {
 | |
|                 fn debug_strict_add(self, other: Self) -> Self {
 | |
|                     if cfg!(debug_assertions) {
 | |
|                         self + other
 | |
|                     } else {
 | |
|                         self.wrapping_add(other)
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         )*
 | |
|     };
 | |
| }
 | |
| 
 | |
| /// See [`DebugStrictAdd`].
 | |
| pub trait DebugStrictSub {
 | |
|     /// See [`DebugStrictAdd`].
 | |
|     fn debug_strict_sub(self, other: Self) -> Self;
 | |
| }
 | |
| 
 | |
| macro_rules! impl_debug_strict_sub {
 | |
|     ($( $ty:ty )*) => {
 | |
|         $(
 | |
|             impl DebugStrictSub for $ty {
 | |
|                 fn debug_strict_sub(self, other: Self) -> Self {
 | |
|                     if cfg!(debug_assertions) {
 | |
|                         self - other
 | |
|                     } else {
 | |
|                         self.wrapping_sub(other)
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         )*
 | |
|     };
 | |
| }
 | |
| 
 | |
| impl_debug_strict_add! {
 | |
|     u8 u16 u32 u64 u128 usize
 | |
|     i8 i16 i32 i64 i128 isize
 | |
| }
 | |
| 
 | |
| impl_debug_strict_sub! {
 | |
|     u8 u16 u32 u64 u128 usize
 | |
|     i8 i16 i32 i64 i128 isize
 | |
| }
 |