From 04e9c20228c38c20c5d4f84328332b2c5c98d5a2 Mon Sep 17 00:00:00 2001 From: Irfan Hudda Date: Wed, 19 Apr 2017 23:59:43 +0530 Subject: [PATCH] next_power_of_two panic on overflow --- src/libcore/num/mod.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) 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 {