diff --git a/src/libcore/num/mod.rs b/src/libcore/num/mod.rs index 487b0dba3c4e..15ffe9db8ce6 100644 --- a/src/libcore/num/mod.rs +++ b/src/libcore/num/mod.rs @@ -2345,7 +2345,11 @@ macro_rules! uint_impl { pub fn next_power_of_two(self) -> Self { let bits = size_of::() * 8; let one: Self = 1; - one << ((bits - self.wrapping_sub(one).leading_zeros() as usize) % bits) + if self == 0 { + 1 + } else { + one << (bits - self.wrapping_sub(one).leading_zeros() as usize) + } } /// Returns the smallest power of two greater than or equal to `n`. If @@ -2363,7 +2367,9 @@ macro_rules! uint_impl { /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub fn checked_next_power_of_two(self) -> Option { - let npot = self.next_power_of_two(); + let bits = size_of::() * 8; + let one: Self = 1; + let npot = one << ((bits - self.wrapping_sub(one).leading_zeros() as usize) % bits); if npot >= self { Some(npot) } else {