diff --git a/src/uucore/src/lib/features/format/spec.rs b/src/uucore/src/lib/features/format/spec.rs index 1af75ae94d4..e7fb7406374 100644 --- a/src/uucore/src/lib/features/format/spec.rs +++ b/src/uucore/src/lib/features/format/spec.rs @@ -511,7 +511,7 @@ fn resolve_asterisk_width( Some(CanAsterisk::Asterisk(loc)) => { let nb = args.next_i64(loc); if nb < 0 { - Some((usize::try_from(-(nb as isize)).ok().unwrap_or(0), true)) + Some((usize::try_from(nb.unsigned_abs()).ok().unwrap_or(0), true)) } else { Some((usize::try_from(nb).ok().unwrap_or(0), false)) } @@ -670,6 +670,17 @@ mod tests { ) ); } + + #[test] + fn asterisk_with_i64_min_width() { + assert_eq!( + Some((1usize.checked_shl(63).unwrap_or(0), true)), + resolve_asterisk_width( + Some(CanAsterisk::Asterisk(ArgumentLocation::NextArgument)), + &mut FormatArguments::new(&[FormatArgument::SignedInt(i64::MIN)]), + ) + ); + } } mod resolve_asterisk_precision {