Skip to content

Commit 1d7e0ec

Browse files
committed
uucore: parser: num_parser: Do not Underflow/Overflow when parsing 0
Values like 0e18172487393827593258 and 0e-18172487393827593258 should just be parsed as 0, and do not need to return an error.
1 parent 94a26e1 commit 1d7e0ec

File tree

1 file changed

+26
-2
lines changed

1 file changed

+26
-2
lines changed

src/uucore/src/lib/features/parser/num_parser.rs

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -294,8 +294,14 @@ fn construct_extended_big_decimal<'a>(
294294
scale: u64,
295295
exponent: BigInt,
296296
) -> Result<ExtendedBigDecimal, ExtendedParserError<'a, ExtendedBigDecimal>> {
297-
if digits == BigUint::zero() && negative {
298-
return Ok(ExtendedBigDecimal::MinusZero);
297+
if digits == BigUint::zero() {
298+
// Return return 0 if the digits are zero. In particular, we do not ever
299+
// return Overflow/Underflow errors in that case.
300+
return Ok(if negative {
301+
ExtendedBigDecimal::MinusZero
302+
} else {
303+
ExtendedBigDecimal::zero()
304+
});
299305
}
300306

301307
let sign = if negative { Sign::Minus } else { Sign::Plus };
@@ -712,6 +718,24 @@ mod tests {
712718
ExtendedBigDecimal::MinusZero
713719
))
714720
));
721+
722+
// But no Overflow/Underflow if the digits are 0.
723+
assert_eq!(
724+
ExtendedBigDecimal::extended_parse(&format!("0e{}", i64::MAX as u64 + 2)),
725+
Ok(ExtendedBigDecimal::zero()),
726+
);
727+
assert_eq!(
728+
ExtendedBigDecimal::extended_parse(&format!("-0.0e{}", i64::MAX as u64 + 3)),
729+
Ok(ExtendedBigDecimal::MinusZero)
730+
);
731+
assert_eq!(
732+
ExtendedBigDecimal::extended_parse(&format!("0.0000e{}", i64::MIN)),
733+
Ok(ExtendedBigDecimal::zero()),
734+
);
735+
assert_eq!(
736+
ExtendedBigDecimal::extended_parse(&format!("-0e{}", i64::MIN + 2)),
737+
Ok(ExtendedBigDecimal::MinusZero)
738+
);
715739
}
716740

717741
#[test]

0 commit comments

Comments
 (0)