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") | ||||
|                 } | ||||
|                 Sign::NoSign => 0, | ||||
|                 Sign::Plus => v.bits(), | ||||
|                 Sign::Plus => { | ||||
|                     // account for sign bit
 | ||||
|                     v.bits().checked_add(1).expect("too big") | ||||
|                 } | ||||
|             } | ||||
|             .try_into() | ||||
|             .expect("too big"), | ||||
|  | @ -693,3 +696,31 @@ impl ToLiteralBits for bool { | |||
|         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