Skip to content

Commit

Permalink
Rollup merge of rust-lang#44287 - Eh2406:master, r=aturon
Browse files Browse the repository at this point in the history
Allow T op= &T for built-in numeric types T v2

Manually rebase of @migi rust-lang#41336
  • Loading branch information
Mark-Simulacrum authored Sep 29, 2017
2 parents f407b2b + 2adeba6 commit f91c55e
Show file tree
Hide file tree
Showing 8 changed files with 147 additions and 3 deletions.
19 changes: 19 additions & 0 deletions src/libcore/internal_macros.rs
Original file line number Diff line number Diff line change
Expand Up @@ -68,3 +68,22 @@ macro_rules! forward_ref_binop {
}
}
}

// implements "T op= &U", based on "T op= U"
// where U is expected to be `Copy`able
macro_rules! forward_ref_op_assign {
(impl $imp:ident, $method:ident for $t:ty, $u:ty) => {
forward_ref_op_assign!(impl $imp, $method for $t, $u,
#[stable(feature = "op_assign_builtins_by_ref", since = "1.22.0")]);
};
(impl $imp:ident, $method:ident for $t:ty, $u:ty, #[$attr:meta]) => {
#[$attr]
impl<'a> $imp<&'a $u> for $t {
#[inline]
fn $method(&mut self, other: &'a $u) {
$imp::$method(self, *other);
}
}
}
}

12 changes: 12 additions & 0 deletions src/libcore/num/wrapping.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ macro_rules! sh_impl_signed {
*self = *self << other;
}
}
forward_ref_op_assign! { impl ShlAssign, shl_assign for Wrapping<$t>, $f }

#[stable(feature = "rust1", since = "1.0.0")]
impl Shr<$f> for Wrapping<$t> {
Expand All @@ -58,6 +59,7 @@ macro_rules! sh_impl_signed {
*self = *self >> other;
}
}
forward_ref_op_assign! { impl ShrAssign, shr_assign for Wrapping<$t>, $f }
)
}

Expand All @@ -80,6 +82,7 @@ macro_rules! sh_impl_unsigned {
*self = *self << other;
}
}
forward_ref_op_assign! { impl ShlAssign, shl_assign for Wrapping<$t>, $f }

#[stable(feature = "rust1", since = "1.0.0")]
impl Shr<$f> for Wrapping<$t> {
Expand All @@ -98,6 +101,7 @@ macro_rules! sh_impl_unsigned {
*self = *self >> other;
}
}
forward_ref_op_assign! { impl ShrAssign, shr_assign for Wrapping<$t>, $f }
)
}

Expand Down Expand Up @@ -142,6 +146,7 @@ macro_rules! wrapping_impl {
*self = *self + other;
}
}
forward_ref_op_assign! { impl AddAssign, add_assign for Wrapping<$t>, Wrapping<$t> }

#[stable(feature = "rust1", since = "1.0.0")]
impl Sub for Wrapping<$t> {
Expand All @@ -162,6 +167,7 @@ macro_rules! wrapping_impl {
*self = *self - other;
}
}
forward_ref_op_assign! { impl SubAssign, sub_assign for Wrapping<$t>, Wrapping<$t> }

#[stable(feature = "rust1", since = "1.0.0")]
impl Mul for Wrapping<$t> {
Expand All @@ -182,6 +188,7 @@ macro_rules! wrapping_impl {
*self = *self * other;
}
}
forward_ref_op_assign! { impl MulAssign, mul_assign for Wrapping<$t>, Wrapping<$t> }

#[stable(feature = "wrapping_div", since = "1.3.0")]
impl Div for Wrapping<$t> {
Expand All @@ -202,6 +209,7 @@ macro_rules! wrapping_impl {
*self = *self / other;
}
}
forward_ref_op_assign! { impl DivAssign, div_assign for Wrapping<$t>, Wrapping<$t> }

#[stable(feature = "wrapping_impls", since = "1.7.0")]
impl Rem for Wrapping<$t> {
Expand All @@ -222,6 +230,7 @@ macro_rules! wrapping_impl {
*self = *self % other;
}
}
forward_ref_op_assign! { impl RemAssign, rem_assign for Wrapping<$t>, Wrapping<$t> }

#[stable(feature = "rust1", since = "1.0.0")]
impl Not for Wrapping<$t> {
Expand Down Expand Up @@ -254,6 +263,7 @@ macro_rules! wrapping_impl {
*self = *self ^ other;
}
}
forward_ref_op_assign! { impl BitXorAssign, bitxor_assign for Wrapping<$t>, Wrapping<$t> }

#[stable(feature = "rust1", since = "1.0.0")]
impl BitOr for Wrapping<$t> {
Expand All @@ -274,6 +284,7 @@ macro_rules! wrapping_impl {
*self = *self | other;
}
}
forward_ref_op_assign! { impl BitOrAssign, bitor_assign for Wrapping<$t>, Wrapping<$t> }

#[stable(feature = "rust1", since = "1.0.0")]
impl BitAnd for Wrapping<$t> {
Expand All @@ -294,6 +305,7 @@ macro_rules! wrapping_impl {
*self = *self & other;
}
}
forward_ref_op_assign! { impl BitAndAssign, bitand_assign for Wrapping<$t>, Wrapping<$t> }

#[stable(feature = "wrapping_neg", since = "1.10.0")]
impl Neg for Wrapping<$t> {
Expand Down
10 changes: 10 additions & 0 deletions src/libcore/ops/arith.rs
Original file line number Diff line number Diff line change
Expand Up @@ -662,6 +662,8 @@ macro_rules! add_assign_impl {
#[rustc_inherit_overflow_checks]
fn add_assign(&mut self, other: $t) { *self += other }
}

forward_ref_op_assign! { impl AddAssign, add_assign for $t, $t }
)+)
}

Expand Down Expand Up @@ -713,6 +715,8 @@ macro_rules! sub_assign_impl {
#[rustc_inherit_overflow_checks]
fn sub_assign(&mut self, other: $t) { *self -= other }
}

forward_ref_op_assign! { impl SubAssign, sub_assign for $t, $t }
)+)
}

Expand Down Expand Up @@ -755,6 +759,8 @@ macro_rules! mul_assign_impl {
#[rustc_inherit_overflow_checks]
fn mul_assign(&mut self, other: $t) { *self *= other }
}

forward_ref_op_assign! { impl MulAssign, mul_assign for $t, $t }
)+)
}

Expand Down Expand Up @@ -796,6 +802,8 @@ macro_rules! div_assign_impl {
#[inline]
fn div_assign(&mut self, other: $t) { *self /= other }
}

forward_ref_op_assign! { impl DivAssign, div_assign for $t, $t }
)+)
}

Expand Down Expand Up @@ -841,6 +849,8 @@ macro_rules! rem_assign_impl {
#[inline]
fn rem_assign(&mut self, other: $t) { *self %= other }
}

forward_ref_op_assign! { impl RemAssign, rem_assign for $t, $t }
)+)
}

Expand Down
10 changes: 10 additions & 0 deletions src/libcore/ops/bit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -593,6 +593,8 @@ macro_rules! bitand_assign_impl {
#[inline]
fn bitand_assign(&mut self, other: $t) { *self &= other }
}

forward_ref_op_assign! { impl BitAndAssign, bitand_assign for $t, $t }
)+)
}

Expand Down Expand Up @@ -638,6 +640,8 @@ macro_rules! bitor_assign_impl {
#[inline]
fn bitor_assign(&mut self, other: $t) { *self |= other }
}

forward_ref_op_assign! { impl BitOrAssign, bitor_assign for $t, $t }
)+)
}

Expand Down Expand Up @@ -683,6 +687,8 @@ macro_rules! bitxor_assign_impl {
#[inline]
fn bitxor_assign(&mut self, other: $t) { *self ^= other }
}

forward_ref_op_assign! { impl BitXorAssign, bitxor_assign for $t, $t }
)+)
}

Expand Down Expand Up @@ -729,6 +735,8 @@ macro_rules! shl_assign_impl {
*self <<= other
}
}

forward_ref_op_assign! { impl ShlAssign, shl_assign for $t, $f }
)
}

Expand Down Expand Up @@ -793,6 +801,8 @@ macro_rules! shr_assign_impl {
*self >>= other
}
}

forward_ref_op_assign! { impl ShrAssign, shr_assign for $t, $f }
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,12 @@
// except according to those terms.

// Test that the type of `sum` falls back to `i32` here,
// and that the for loop desugaring doesn't inferfere with
// and that the for loop desugaring doesn't interfere with
// that.

fn main() {
let mut sum = 0;
for i in Vec::new() {
sum += i;
sum += &i;
}
}
9 changes: 9 additions & 0 deletions src/test/run-pass/num-wrapping.rs
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,15 @@ fn test_op_assigns() {
tmp.$op(Wrapping($rhs));
assert_eq!(black_box(tmp), Wrapping($ans));
}

// also test that a &Wrapping<T> right-hand side is possible
{
let mut tmp = Wrapping($initial);
tmp = black_box(tmp);
tmp.$op(&Wrapping($rhs));
assert_eq!(black_box(tmp), Wrapping($ans));
}

// FIXME(30524): Uncomment this test
/*
{
Expand Down
84 changes: 84 additions & 0 deletions src/test/run-pass/op-assign-builtins-by-ref.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

fn main() {
// test compound assignment operators with ref as right-hand side,
// for each operator, with various types as operands.

// test AddAssign
{
let mut x = 3i8;
x += &2i8;
assert_eq!(x, 5i8);
}

// test SubAssign
{
let mut x = 7i16;
x -= &4;
assert_eq!(x, 3i16);
}

// test MulAssign
{
let mut x = 3f32;
x *= &3f32;
assert_eq!(x, 9f32);
}

// test DivAssign
{
let mut x = 6f64;
x /= &2f64;
assert_eq!(x, 3f64);
}

// test RemAssign
{
let mut x = 7i64;
x %= &4i64;
assert_eq!(x, 3i64);
}

// test BitOrAssign
{
let mut x = 0b1010u8;
x |= &0b1100u8;
assert_eq!(x, 0b1110u8);
}

// test BitAndAssign
{
let mut x = 0b1010u16;
x &= &0b1100u16;
assert_eq!(x, 0b1000u16);
}

// test BitXorAssign
{
let mut x = 0b1010u32;
x ^= &0b1100u32;
assert_eq!(x, 0b0110u32);
}

// test ShlAssign
{
let mut x = 0b1010u64;
x <<= &2u32;
assert_eq!(x, 0b101000u64);
}

// test ShrAssign
{
let mut x = 0b1010u64;
x >>= &2i16;
assert_eq!(x, 0b10u64);
}
}
2 changes: 1 addition & 1 deletion src/tools/cargotest/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ const TEST_REPOS: &'static [Test] = &[
Test {
name: "xsv",
repo: "https://github.com/BurntSushi/xsv",
sha: "a9a7163f2a2953cea426fee1216bec914fe2f56a",
sha: "4b308adbe48ac81657fd124b90b44f7c3263f771",
lock: None,
},
];
Expand Down

0 comments on commit f91c55e

Please sign in to comment.