| //@ run-pass |
| use std::ops::{AddAssign, SubAssign, MulAssign, DivAssign, RemAssign}; |
| use std::ops::{BitAndAssign, BitOrAssign, BitXorAssign, ShlAssign, ShrAssign}; |
| |
| struct A(i32); |
| |
| macro_rules! trivial_binop { |
| ($Trait:ident, $m:ident) => { |
| impl $Trait<i32> for A { fn $m(&mut self, rhs: i32) { self.0 = rhs; } } |
| } |
| } |
| |
| trivial_binop!(AddAssign, add_assign); |
| trivial_binop!(SubAssign, sub_assign); |
| trivial_binop!(MulAssign, mul_assign); |
| trivial_binop!(DivAssign, div_assign); |
| trivial_binop!(RemAssign, rem_assign); |
| trivial_binop!(BitAndAssign, bitand_assign); |
| trivial_binop!(BitOrAssign, bitor_assign); |
| trivial_binop!(BitXorAssign, bitxor_assign); |
| trivial_binop!(ShlAssign, shl_assign); |
| trivial_binop!(ShrAssign, shr_assign); |
| |
| fn main() { |
| let mut a = A(10); |
| a += a.0; |
| a -= a.0; |
| a *= a.0; |
| a /= a.0; |
| a &= a.0; |
| a |= a.0; |
| a ^= a.0; |
| a <<= a.0; |
| a >>= a.0; |
| } |