Manuall rebase of @Migi pull/41336
This commit is contained in:
parent
23ade23cbc
commit
f65bb2a051
6 changed files with 144 additions and 0 deletions
|
@ -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.18.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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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> {
|
||||
|
@ -58,6 +59,7 @@ macro_rules! sh_impl_signed {
|
|||
*self = *self >> other;
|
||||
}
|
||||
}
|
||||
forward_ref_op_assign! { impl ShrAssign, shr_assign for Wrapping<$t>, $f }
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -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> {
|
||||
|
@ -98,6 +101,7 @@ macro_rules! sh_impl_unsigned {
|
|||
*self = *self >> other;
|
||||
}
|
||||
}
|
||||
forward_ref_op_assign! { impl ShrAssign, shr_assign for Wrapping<$t>, $f }
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -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> {
|
||||
|
@ -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> {
|
||||
|
@ -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> {
|
||||
|
@ -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> {
|
||||
|
@ -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> {
|
||||
|
@ -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> {
|
||||
|
@ -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> {
|
||||
|
@ -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> {
|
||||
|
|
|
@ -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 }
|
||||
)+)
|
||||
}
|
||||
|
||||
|
@ -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 }
|
||||
)+)
|
||||
}
|
||||
|
||||
|
@ -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 }
|
||||
)+)
|
||||
}
|
||||
|
||||
|
@ -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 }
|
||||
)+)
|
||||
}
|
||||
|
||||
|
@ -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 }
|
||||
)+)
|
||||
}
|
||||
|
||||
|
|
|
@ -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 }
|
||||
)+)
|
||||
}
|
||||
|
||||
|
@ -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 }
|
||||
)+)
|
||||
}
|
||||
|
||||
|
@ -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 }
|
||||
)+)
|
||||
}
|
||||
|
||||
|
@ -729,6 +735,8 @@ macro_rules! shl_assign_impl {
|
|||
*self <<= other
|
||||
}
|
||||
}
|
||||
|
||||
forward_ref_op_assign! { impl ShlAssign, shl_assign for $t, $f }
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -793,6 +801,8 @@ macro_rules! shr_assign_impl {
|
|||
*self >>= other
|
||||
}
|
||||
}
|
||||
|
||||
forward_ref_op_assign! { impl ShrAssign, shr_assign for $t, $f }
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
/*
|
||||
{
|
||||
|
|
84
src/test/run-pass/op-assign-builtins-by-ref.rs
Normal file
84
src/test/run-pass/op-assign-builtins-by-ref.rs
Normal file
|
@ -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);
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue