diff --git a/src/libcore/ops.rs b/src/libcore/ops.rs index ecf80d7e30a..3fb720ab6c8 100644 --- a/src/libcore/ops.rs +++ b/src/libcore/ops.rs @@ -441,6 +441,7 @@ macro_rules! rem_impl_integer { rem_impl_integer! { usize u8 u16 u32 u64 isize i8 i16 i32 i64 } +#[cfg(not(stage0))] macro_rules! rem_impl_float { ($($t:ty)*) => ($( #[stable(feature = "rust1", since = "1.0.0")] @@ -455,8 +456,48 @@ macro_rules! rem_impl_float { )*) } +#[cfg(not(stage0))] rem_impl_float! { f32 f64 } +#[stable(feature = "rust1", since = "1.0.0")] +#[cfg(stage0)] +impl Rem for f32 { + type Output = f32; + + // The builtin f32 rem operator is broken when targeting + // MSVC; see comment in std::f32::floor. + // FIXME: See also #27859. + #[inline] + #[cfg(target_env = "msvc")] + fn rem(self, other: f32) -> f32 { + (self as f64).rem(other as f64) as f32 + } + + #[inline] + #[cfg(not(target_env = "msvc"))] + fn rem(self, other: f32) -> f32 { + extern { fn fmodf(a: f32, b: f32) -> f32; } + unsafe { fmodf(self, other) } + } +} + +#[stable(feature = "rust1", since = "1.0.0")] +#[cfg(stage0)] +impl Rem for f64 { + type Output = f64; + + #[inline] + fn rem(self, other: f64) -> f64 { + extern { fn fmod(a: f64, b: f64) -> f64; } + unsafe { fmod(self, other) } + } +} + +#[cfg(stage0)] +forward_ref_binop! { impl Rem, rem for f64, f64 } +#[cfg(stage0)] +forward_ref_binop! { impl Rem, rem for f32, f32 } + /// The `Neg` trait is used to specify the functionality of unary `-`. /// /// # Examples