Fix SInt::for_value not accounting for sign bit for positive values #5
					 1 changed files with 32 additions and 1 deletions
				
			
		|  | @ -453,7 +453,10 @@ impl SInt { | ||||||
|                     v.not().bits().checked_add(1).expect("too big") |                     v.not().bits().checked_add(1).expect("too big") | ||||||
|                 } |                 } | ||||||
|                 Sign::NoSign => 0, |                 Sign::NoSign => 0, | ||||||
|                 Sign::Plus => v.bits(), |                 Sign::Plus => { | ||||||
|  |                     // account for sign bit
 | ||||||
|  |                     v.bits().checked_add(1).expect("too big") | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
|             .try_into() |             .try_into() | ||||||
|             .expect("too big"), |             .expect("too big"), | ||||||
|  | @ -693,3 +696,31 @@ impl ToLiteralBits for bool { | ||||||
|         Ok(interned_bit(*self)) |         Ok(interned_bit(*self)) | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | #[cfg(test)] | ||||||
|  | mod tests { | ||||||
|  |     use super::*; | ||||||
|  | 
 | ||||||
|  |     #[test] | ||||||
|  |     fn test_uint_for_value() { | ||||||
|  |         assert_eq!(UInt::for_value(0u8).width, 0); | ||||||
|  |         assert_eq!(UInt::for_value(1u8).width, 1); | ||||||
|  |         assert_eq!(UInt::for_value(2u8).width, 2); | ||||||
|  |         assert_eq!(UInt::for_value(3u8).width, 2); | ||||||
|  |         assert_eq!(UInt::for_value(4u8).width, 3); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     #[test] | ||||||
|  |     fn test_sint_for_value() { | ||||||
|  |         assert_eq!(SInt::for_value(-5).width, 4); | ||||||
|  |         assert_eq!(SInt::for_value(-4).width, 3); | ||||||
|  |         assert_eq!(SInt::for_value(-3).width, 3); | ||||||
|  |         assert_eq!(SInt::for_value(-2).width, 2); | ||||||
|  |         assert_eq!(SInt::for_value(-1).width, 1); | ||||||
|  |         assert_eq!(SInt::for_value(0).width, 0); | ||||||
|  |         assert_eq!(SInt::for_value(1).width, 2); | ||||||
|  |         assert_eq!(SInt::for_value(2).width, 3); | ||||||
|  |         assert_eq!(SInt::for_value(3).width, 3); | ||||||
|  |         assert_eq!(SInt::for_value(4).width, 4); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue