Skip to content

Commit c7f0261

Browse files
committed
---
yaml --- r: 188325 b: refs/heads/master c: c8db89a h: refs/heads/master i: 188323: 9f93191 v: v3
1 parent d6906f4 commit c7f0261

File tree

6 files changed

+40
-23
lines changed

6 files changed

+40
-23
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: 4394720dae12c119a9b1aed492b1b24ee089d808
2+
refs/heads/master: c8db89aa82573b89481fde598da6e54371f266cb
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: 3a96d6a9818fe2affc98a187fb1065120458cee9
55
refs/heads/try: 649d35e4d830b27806705dc5352c86ab6d6fd1a1

trunk/src/libcore/num/mod.rs

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
#![stable(feature = "rust1", since = "1.0.0")]
1616
#![allow(missing_docs)]
1717

18+
use self::wrapping::{OverflowingOps, WrappingOps};
19+
1820
use char::CharExt;
1921
use clone::Clone;
2022
use cmp::{PartialEq, Eq, PartialOrd, Ord};
@@ -51,6 +53,8 @@ pub trait Int
5153
+ BitXor<Output=Self>
5254
+ Shl<uint, Output=Self>
5355
+ Shr<uint, Output=Self>
56+
+ WrappingOps
57+
+ OverflowingOps
5458
{
5559
/// Returns the `0` value of this integer type.
5660
// FIXME (#5527): Should be an associated constant
@@ -379,11 +383,23 @@ pub trait Int
379383
let mut base = self;
380384
let mut acc: Self = Int::one();
381385

386+
let mut prev_base = self;
387+
let mut base_oflo = false;
382388
while exp > 0 {
383389
if (exp & 1) == 1 {
384-
acc = acc * base;
390+
if base_oflo {
391+
// ensure overflow occurs in the same manner it
392+
// would have otherwise (i.e. signal any exception
393+
// it would have otherwise).
394+
acc = acc * (prev_base * prev_base);
395+
} else {
396+
acc = acc * base;
397+
}
385398
}
386-
base = base * base;
399+
prev_base = base;
400+
let (new_base, new_base_oflo) = base.overflowing_mul(base);
401+
base = new_base;
402+
base_oflo = new_base_oflo;
387403
exp /= 2;
388404
}
389405
acc
@@ -694,12 +710,12 @@ signed_int_impl! { int }
694710

695711
/// A built-in unsigned integer.
696712
#[stable(feature = "rust1", since = "1.0.0")]
697-
pub trait UnsignedInt: Int {
713+
pub trait UnsignedInt: Int + WrappingOps {
698714
/// Returns `true` iff `self == 2^k` for some `k`.
699715
#[stable(feature = "rust1", since = "1.0.0")]
700716
#[inline]
701717
fn is_power_of_two(self) -> bool {
702-
(self - Int::one()) & self == Int::zero() && !(self == Int::zero())
718+
(self.wrapping_sub(Int::one())) & self == Int::zero() && !(self == Int::zero())
703719
}
704720

705721
/// Returns the smallest power of two greater than or equal to `self`.
@@ -709,7 +725,7 @@ pub trait UnsignedInt: Int {
709725
fn next_power_of_two(self) -> Self {
710726
let bits = size_of::<Self>() * 8;
711727
let one: Self = Int::one();
712-
one << ((bits - (self - one).leading_zeros() as usize) % bits)
728+
one << ((bits - self.wrapping_sub(one).leading_zeros() as usize) % bits)
713729
}
714730

715731
/// Returns the smallest power of two greater than or equal to `n`. If the

trunk/src/libcore/num/uint_macros.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,6 @@ pub const BYTES : u32 = ($bits / 8);
2020
#[stable(feature = "rust1", since = "1.0.0")]
2121
pub const MIN: $T = 0 as $T;
2222
#[stable(feature = "rust1", since = "1.0.0")]
23-
pub const MAX: $T = 0 as $T - 1 as $T;
23+
pub const MAX: $T = !0 as $T;
2424

2525
) }

trunk/src/libcoretest/num/mod.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,31 +92,31 @@ mod test {
9292
assert_eq!("127".parse::<i8>().ok(), Some(i8_val));
9393
assert_eq!("128".parse::<i8>().ok(), None);
9494

95-
i8_val += 1 as i8;
95+
i8_val = i8_val.wrapping_add(1);
9696
assert_eq!("-128".parse::<i8>().ok(), Some(i8_val));
9797
assert_eq!("-129".parse::<i8>().ok(), None);
9898

9999
let mut i16_val: i16 = 32_767_i16;
100100
assert_eq!("32767".parse::<i16>().ok(), Some(i16_val));
101101
assert_eq!("32768".parse::<i16>().ok(), None);
102102

103-
i16_val += 1 as i16;
103+
i16_val = i16_val.wrapping_add(1);
104104
assert_eq!("-32768".parse::<i16>().ok(), Some(i16_val));
105105
assert_eq!("-32769".parse::<i16>().ok(), None);
106106

107107
let mut i32_val: i32 = 2_147_483_647_i32;
108108
assert_eq!("2147483647".parse::<i32>().ok(), Some(i32_val));
109109
assert_eq!("2147483648".parse::<i32>().ok(), None);
110110

111-
i32_val += 1 as i32;
111+
i32_val = i32_val.wrapping_add(1);
112112
assert_eq!("-2147483648".parse::<i32>().ok(), Some(i32_val));
113113
assert_eq!("-2147483649".parse::<i32>().ok(), None);
114114

115115
let mut i64_val: i64 = 9_223_372_036_854_775_807_i64;
116116
assert_eq!("9223372036854775807".parse::<i64>().ok(), Some(i64_val));
117117
assert_eq!("9223372036854775808".parse::<i64>().ok(), None);
118118

119-
i64_val += 1 as i64;
119+
i64_val = i64_val.wrapping_add(1);
120120
assert_eq!("-9223372036854775808".parse::<i64>().ok(), Some(i64_val));
121121
assert_eq!("-9223372036854775809".parse::<i64>().ok(), None);
122122
}

trunk/src/libstd/num/mod.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1758,25 +1758,25 @@ mod tests {
17581758
let mut u8_val: u8 = 255_u8;
17591759
assert_eq!(u8_val.to_string(), "255");
17601760

1761-
u8_val += 1 as u8;
1761+
u8_val = u8_val.wrapping_add(1);
17621762
assert_eq!(u8_val.to_string(), "0");
17631763

17641764
let mut u16_val: u16 = 65_535_u16;
17651765
assert_eq!(u16_val.to_string(), "65535");
17661766

1767-
u16_val += 1 as u16;
1767+
u16_val = u16_val.wrapping_add(1);
17681768
assert_eq!(u16_val.to_string(), "0");
17691769

17701770
let mut u32_val: u32 = 4_294_967_295_u32;
17711771
assert_eq!(u32_val.to_string(), "4294967295");
17721772

1773-
u32_val += 1 as u32;
1773+
u32_val = u32_val.wrapping_add(1);
17741774
assert_eq!(u32_val.to_string(), "0");
17751775

17761776
let mut u64_val: u64 = 18_446_744_073_709_551_615_u64;
17771777
assert_eq!(u64_val.to_string(), "18446744073709551615");
17781778

1779-
u64_val += 1 as u64;
1779+
u64_val = u64_val.wrapping_add(1);
17801780
assert_eq!(u64_val.to_string(), "0");
17811781
}
17821782

@@ -1790,31 +1790,31 @@ mod tests {
17901790
assert_eq!(from_str::<u8>("255"), Some(u8_val));
17911791
assert_eq!(from_str::<u8>("256"), None);
17921792

1793-
u8_val += 1 as u8;
1793+
u8_val = u8_val.wrapping_add(1);
17941794
assert_eq!(from_str::<u8>("0"), Some(u8_val));
17951795
assert_eq!(from_str::<u8>("-1"), None);
17961796

17971797
let mut u16_val: u16 = 65_535_u16;
17981798
assert_eq!(from_str::<u16>("65535"), Some(u16_val));
17991799
assert_eq!(from_str::<u16>("65536"), None);
18001800

1801-
u16_val += 1 as u16;
1801+
u16_val = u16_val.wrapping_add(1);
18021802
assert_eq!(from_str::<u16>("0"), Some(u16_val));
18031803
assert_eq!(from_str::<u16>("-1"), None);
18041804

18051805
let mut u32_val: u32 = 4_294_967_295_u32;
18061806
assert_eq!(from_str::<u32>("4294967295"), Some(u32_val));
18071807
assert_eq!(from_str::<u32>("4294967296"), None);
18081808

1809-
u32_val += 1 as u32;
1809+
u32_val = u32_val.wrapping_add(1);
18101810
assert_eq!(from_str::<u32>("0"), Some(u32_val));
18111811
assert_eq!(from_str::<u32>("-1"), None);
18121812

18131813
let mut u64_val: u64 = 18_446_744_073_709_551_615_u64;
18141814
assert_eq!(from_str::<u64>("18446744073709551615"), Some(u64_val));
18151815
assert_eq!(from_str::<u64>("18446744073709551616"), None);
18161816

1817-
u64_val += 1 as u64;
1817+
u64_val = u64_val.wrapping_add(1);
18181818
assert_eq!(from_str::<u64>("0"), Some(u64_val));
18191819
assert_eq!(from_str::<u64>("-1"), None);
18201820
}

trunk/src/libstd/num/strconv.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -427,32 +427,33 @@ static DIGIT_E_RADIX: u32 = ('e' as u32) - ('a' as u32) + 11;
427427

428428
#[cfg(test)]
429429
mod tests {
430+
use core::num::wrapping::WrappingOps;
430431
use string::ToString;
431432

432433
#[test]
433434
fn test_int_to_str_overflow() {
434435
let mut i8_val: i8 = 127_i8;
435436
assert_eq!(i8_val.to_string(), "127");
436437

437-
i8_val += 1 as i8;
438+
i8_val = i8_val.wrapping_add(1);
438439
assert_eq!(i8_val.to_string(), "-128");
439440

440441
let mut i16_val: i16 = 32_767_i16;
441442
assert_eq!(i16_val.to_string(), "32767");
442443

443-
i16_val += 1 as i16;
444+
i16_val = i16_val.wrapping_add(1);
444445
assert_eq!(i16_val.to_string(), "-32768");
445446

446447
let mut i32_val: i32 = 2_147_483_647_i32;
447448
assert_eq!(i32_val.to_string(), "2147483647");
448449

449-
i32_val += 1 as i32;
450+
i32_val = i32_val.wrapping_add(1);
450451
assert_eq!(i32_val.to_string(), "-2147483648");
451452

452453
let mut i64_val: i64 = 9_223_372_036_854_775_807_i64;
453454
assert_eq!(i64_val.to_string(), "9223372036854775807");
454455

455-
i64_val += 1 as i64;
456+
i64_val = i64_val.wrapping_add(1);
456457
assert_eq!(i64_val.to_string(), "-9223372036854775808");
457458
}
458459
}

0 commit comments

Comments
 (0)