Skip to content

Commit 7322ac0

Browse files
committed
[DO NOT MERGE] Indirect through a method
This fixes the ICE. For demonstration only.
1 parent 8d7f2e4 commit 7322ac0

File tree

8 files changed

+44
-32
lines changed

8 files changed

+44
-32
lines changed

src/libcore/fmt/num.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ trait GenericRadix {
5252
fn fmt_int<T: Int>(&self, mut x: T, f: &mut fmt::Formatter) -> fmt::Result {
5353
// The radix can be as low as 2, so we need a buffer of at least 64
5454
// characters for a base 2 number.
55-
let zero = T::ZERO;
55+
let zero = T::zero();
5656
let is_positive = x >= zero;
5757
let mut buf = [0; 64];
5858
let mut curr = buf.len();

src/libcore/iter.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -1075,7 +1075,7 @@ pub trait Iterator {
10751075
S: Add<Self::Item, Output=S> + Zero,
10761076
Self: Sized,
10771077
{
1078-
self.fold(Zero::ZERO, |s, e| s + e)
1078+
self.fold(Zero::zero(), |s, e| s + e)
10791079
}
10801080

10811081
/// Iterates over the entire iterator, multiplying all the elements
@@ -1097,7 +1097,7 @@ pub trait Iterator {
10971097
P: Mul<Self::Item, Output=P> + One,
10981098
Self: Sized,
10991099
{
1100-
self.fold(One::ONE, |p, e| p * e)
1100+
self.fold(One::one(), |p, e| p * e)
11011101
}
11021102
}
11031103

@@ -2840,7 +2840,7 @@ impl<A> DoubleEndedIterator for RangeInclusive<A> where
28402840
fn next_back(&mut self) -> Option<A> {
28412841
if self.range.end > self.range.start {
28422842
let result = self.range.end.clone();
2843-
self.range.end = &self.range.end - &A::ONE;
2843+
self.range.end = &self.range.end - &A::one();
28442844
Some(result)
28452845
} else if !self.done && self.range.start == self.range.end {
28462846
self.done = true;
@@ -2858,7 +2858,7 @@ impl<A: Step + Zero + Clone> Iterator for StepBy<A, ops::Range<A>> {
28582858

28592859
#[inline]
28602860
fn next(&mut self) -> Option<A> {
2861-
let rev = self.step_by < A::ZERO;
2861+
let rev = self.step_by < A::zero();
28622862
if (rev && self.range.start > self.range.end) ||
28632863
(!rev && self.range.start < self.range.end)
28642864
{
@@ -2906,7 +2906,7 @@ impl<A: Step + One> Iterator for ops::Range<A> where
29062906
#[inline]
29072907
fn next(&mut self) -> Option<A> {
29082908
if self.start < self.end {
2909-
let mut n = &self.start + &A::ONE;
2909+
let mut n = &self.start + &A::one();
29102910
mem::swap(&mut n, &mut self.start);
29112911
Some(n)
29122912
} else {
@@ -2916,7 +2916,7 @@ impl<A: Step + One> Iterator for ops::Range<A> where
29162916

29172917
#[inline]
29182918
fn size_hint(&self) -> (usize, Option<usize>) {
2919-
match Step::steps_between(&self.start, &self.end, &A::ONE) {
2919+
match Step::steps_between(&self.start, &self.end, &A::one()) {
29202920
Some(hint) => (hint, Some(hint)),
29212921
None => (0, None)
29222922
}
@@ -2936,7 +2936,7 @@ impl<A: Step + One + Clone> DoubleEndedIterator for ops::Range<A> where
29362936
#[inline]
29372937
fn next_back(&mut self) -> Option<A> {
29382938
if self.start < self.end {
2939-
self.end = &self.end - &A::ONE;
2939+
self.end = &self.end - &A::one();
29402940
Some(self.end.clone())
29412941
} else {
29422942
None
@@ -2953,7 +2953,7 @@ impl<A: Step + One> Iterator for ops::RangeFrom<A> where
29532953

29542954
#[inline]
29552955
fn next(&mut self) -> Option<A> {
2956-
let mut n = &self.start + &A::ONE;
2956+
let mut n = &self.start + &A::one();
29572957
mem::swap(&mut n, &mut self.start);
29582958
Some(n)
29592959
}

src/libcore/num/mod.rs

+21-9
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ pub mod flt2dec;
5353
/// `x + T::ZERO == x`.
5454
#[unstable(feature = "zero_one", reason = "unsure of placement")]
5555
pub trait Zero {
56+
fn zero() -> Self;
57+
5658
/// The "zero" (usually, additive identity) for this type.
5759
const ZERO: Self;
5860
}
@@ -63,16 +65,22 @@ pub trait Zero {
6365
/// `x * T::ONE == x`.
6466
#[unstable(feature = "zero_one", reason = "unsure of placement")]
6567
pub trait One {
68+
fn one() -> Self;
69+
6670
/// The "one" (usually, multiplicative identity) for this type.
6771
const ONE: Self;
6872
}
6973

7074
macro_rules! zero_one_impl {
7175
($($t:ty)*) => ($(
7276
impl Zero for $t {
77+
fn zero() -> Self { Self::ZERO }
78+
7379
const ZERO: $t = 0;
7480
}
7581
impl One for $t {
82+
fn one() -> Self { Self::ONE }
83+
7684
const ONE: $t = 1;
7785
}
7886
)*)
@@ -82,9 +90,13 @@ zero_one_impl! { u8 u16 u32 u64 usize i8 i16 i32 i64 isize }
8290
macro_rules! zero_one_impl_float {
8391
($($t:ty)*) => ($(
8492
impl Zero for $t {
93+
fn zero() -> Self { Self::ZERO }
94+
8595
const ZERO: $t = 0.0;
8696
}
8797
impl One for $t {
98+
fn one() -> Self { Self::ONE }
99+
88100
const ONE: $t = 1.0;
89101
}
90102
)*)
@@ -409,7 +421,7 @@ macro_rules! int_impl {
409421
pub fn saturating_add(self, other: Self) -> Self {
410422
match self.checked_add(other) {
411423
Some(x) => x,
412-
None if other >= Self::ZERO => Self::max_value(),
424+
None if other >= Self::zero() => Self::max_value(),
413425
None => Self::min_value(),
414426
}
415427
}
@@ -421,7 +433,7 @@ macro_rules! int_impl {
421433
pub fn saturating_sub(self, other: Self) -> Self {
422434
match self.checked_sub(other) {
423435
Some(x) => x,
424-
None if other >= Self::ZERO => Self::min_value(),
436+
None if other >= Self::zero() => Self::min_value(),
425437
None => Self::max_value(),
426438
}
427439
}
@@ -529,7 +541,7 @@ macro_rules! int_impl {
529541
#[inline]
530542
pub fn pow(self, mut exp: u32) -> Self {
531543
let mut base = self;
532-
let mut acc = Self::ONE;
544+
let mut acc = Self::one();
533545

534546
let mut prev_base = self;
535547
let mut base_oflo = false;
@@ -979,7 +991,7 @@ macro_rules! uint_impl {
979991
pub fn saturating_add(self, other: Self) -> Self {
980992
match self.checked_add(other) {
981993
Some(x) => x,
982-
None if other >= Self::ZERO => Self::max_value(),
994+
None if other >= Self::zero() => Self::max_value(),
983995
None => Self::min_value(),
984996
}
985997
}
@@ -991,7 +1003,7 @@ macro_rules! uint_impl {
9911003
pub fn saturating_sub(self, other: Self) -> Self {
9921004
match self.checked_sub(other) {
9931005
Some(x) => x,
994-
None if other >= Self::ZERO => Self::min_value(),
1006+
None if other >= Self::zero() => Self::min_value(),
9951007
None => Self::max_value(),
9961008
}
9971009
}
@@ -1097,7 +1109,7 @@ macro_rules! uint_impl {
10971109
#[inline]
10981110
pub fn pow(self, mut exp: u32) -> Self {
10991111
let mut base = self;
1100-
let mut acc = Self::ONE;
1112+
let mut acc = Self::one();
11011113

11021114
let mut prev_base = self;
11031115
let mut base_oflo = false;
@@ -1125,8 +1137,8 @@ macro_rules! uint_impl {
11251137
#[stable(feature = "rust1", since = "1.0.0")]
11261138
#[inline]
11271139
pub fn is_power_of_two(self) -> bool {
1128-
(self.wrapping_sub(Self::ONE)) & self == Self::ZERO &&
1129-
!(self == Self::ZERO)
1140+
(self.wrapping_sub(Self::one())) & self == Self::zero() &&
1141+
!(self == Self::zero())
11301142
}
11311143

11321144
/// Returns the smallest power of two greater than or equal to `self`.
@@ -1135,7 +1147,7 @@ macro_rules! uint_impl {
11351147
#[inline]
11361148
pub fn next_power_of_two(self) -> Self {
11371149
let bits = size_of::<Self>() * 8;
1138-
let one = Self::ONE;
1150+
let one = Self::one();
11391151
one << ((bits - self.wrapping_sub(one).leading_zeros() as usize) % bits)
11401152
}
11411153

src/libstd/num/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ mod tests {
202202
#[test]
203203
fn test_pow() {
204204
fn naive_pow<T: Mul<Output=T> + One + Copy>(base: T, exp: usize) -> T {
205-
let one: T = T::ONE;
205+
let one: T = T::one();
206206
(0..exp).fold(one, |acc, _| acc * base)
207207
}
208208
macro_rules! assert_pow {

src/libstd/sys/unix/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ pub fn decode_error_kind(errno: i32) -> ErrorKind {
7575
}
7676

7777
pub fn cvt<T: One + PartialEq + Neg<Output=T>>(t: T) -> io::Result<T> {
78-
let one: T = T::ONE;
78+
let one: T = T::one();
7979
if t == -one {
8080
Err(io::Error::last_os_error())
8181
} else {

src/libstd/sys/windows/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ pub fn truncate_utf16_at_nul<'a>(v: &'a [u16]) -> &'a [u16] {
145145
}
146146

147147
fn cvt<I: PartialEq + Zero>(i: I) -> io::Result<I> {
148-
if i == I::ZERO {
148+
if i == I::zero() {
149149
Err(io::Error::last_os_error())
150150
} else {
151151
Ok(i)

src/libstd/sys/windows/net.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ fn last_error() -> io::Error {
5050
/// and if so, returns the last error from the Windows socket interface. . This
5151
/// function must be called before another call to the socket API is made.
5252
pub fn cvt<T: One + Neg<Output=T> + PartialEq>(t: T) -> io::Result<T> {
53-
let one: T = T::ONE;
53+
let one: T = T::one();
5454
if t == -one {
5555
Err(last_error())
5656
} else {

src/test/run-pass/issue-8460.rs

+10-10
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,19 @@ fn main() {
1919
assert!(thread::spawn(move|| { i16::min_value() / -1; }).join().is_err());
2020
assert!(thread::spawn(move|| { i32::min_value() / -1; }).join().is_err());
2121
assert!(thread::spawn(move|| { i64::min_value() / -1; }).join().is_err());
22-
assert!(thread::spawn(move|| { 1isize / isize::ZERO; }).join().is_err());
23-
assert!(thread::spawn(move|| { 1i8 / i8::ZERO; }).join().is_err());
24-
assert!(thread::spawn(move|| { 1i16 / i16::ZERO; }).join().is_err());
25-
assert!(thread::spawn(move|| { 1i32 / i32::ZERO; }).join().is_err());
26-
assert!(thread::spawn(move|| { 1i64 / i64::ZERO; }).join().is_err());
22+
assert!(thread::spawn(move|| { 1isize / isize::zero(); }).join().is_err());
23+
assert!(thread::spawn(move|| { 1i8 / i8::zero(); }).join().is_err());
24+
assert!(thread::spawn(move|| { 1i16 / i16::zero(); }).join().is_err());
25+
assert!(thread::spawn(move|| { 1i32 / i32::zero(); }).join().is_err());
26+
assert!(thread::spawn(move|| { 1i64 / i64::zero(); }).join().is_err());
2727
assert!(thread::spawn(move|| { isize::min_value() % -1; }).join().is_err());
2828
assert!(thread::spawn(move|| { i8::min_value() % -1; }).join().is_err());
2929
assert!(thread::spawn(move|| { i16::min_value() % -1; }).join().is_err());
3030
assert!(thread::spawn(move|| { i32::min_value() % -1; }).join().is_err());
3131
assert!(thread::spawn(move|| { i64::min_value() % -1; }).join().is_err());
32-
assert!(thread::spawn(move|| { 1isize % isize::ZERO; }).join().is_err());
33-
assert!(thread::spawn(move|| { 1i8 % i8::ZERO; }).join().is_err());
34-
assert!(thread::spawn(move|| { 1i16 % i16::ZERO; }).join().is_err());
35-
assert!(thread::spawn(move|| { 1i32 % i32::ZERO; }).join().is_err());
36-
assert!(thread::spawn(move|| { 1i64 % i64::ZERO; }).join().is_err());
32+
assert!(thread::spawn(move|| { 1isize % isize::zero(); }).join().is_err());
33+
assert!(thread::spawn(move|| { 1i8 % i8::zero(); }).join().is_err());
34+
assert!(thread::spawn(move|| { 1i16 % i16::zero(); }).join().is_err());
35+
assert!(thread::spawn(move|| { 1i32 % i32::zero(); }).join().is_err());
36+
assert!(thread::spawn(move|| { 1i64 % i64::zero(); }).join().is_err());
3737
}

0 commit comments

Comments
 (0)