mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 13:04:42 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			173 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			173 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| // run-pass
 | |
| 
 | |
| #![allow(unused_imports)]
 | |
| #![deny(unused_assignments)]
 | |
| 
 | |
| use std::mem;
 | |
| use std::ops::{
 | |
|     AddAssign, BitAndAssign, BitOrAssign, BitXorAssign, DivAssign, Index, MulAssign, RemAssign,
 | |
|     ShlAssign, ShrAssign, SubAssign,
 | |
| };
 | |
| 
 | |
| #[derive(Debug, PartialEq)]
 | |
| struct Int(i32);
 | |
| 
 | |
| struct Slice([i32]);
 | |
| 
 | |
| impl Slice {
 | |
|     fn new(slice: &mut [i32]) -> &mut Slice {
 | |
|         unsafe {
 | |
|             mem::transmute(slice)
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| struct View<'a>(&'a mut [i32]);
 | |
| 
 | |
| fn main() {
 | |
|     let mut x = Int(1);
 | |
| 
 | |
|     x += Int(2);
 | |
|     assert_eq!(x, Int(0b11));
 | |
| 
 | |
|     x &= Int(0b01);
 | |
|     assert_eq!(x, Int(0b01));
 | |
| 
 | |
|     x |= Int(0b10);
 | |
|     assert_eq!(x, Int(0b11));
 | |
| 
 | |
|     x ^= Int(0b01);
 | |
|     assert_eq!(x, Int(0b10));
 | |
| 
 | |
|     x /= Int(2);
 | |
|     assert_eq!(x, Int(1));
 | |
| 
 | |
|     x *= Int(3);
 | |
|     assert_eq!(x, Int(3));
 | |
| 
 | |
|     x %= Int(2);
 | |
|     assert_eq!(x, Int(1));
 | |
| 
 | |
|     // overloaded RHS
 | |
|     x <<= 1u8;
 | |
|     assert_eq!(x, Int(2));
 | |
| 
 | |
|     x <<= 1u16;
 | |
|     assert_eq!(x, Int(4));
 | |
| 
 | |
|     x >>= 1u8;
 | |
|     assert_eq!(x, Int(2));
 | |
| 
 | |
|     x >>= 1u16;
 | |
|     assert_eq!(x, Int(1));
 | |
| 
 | |
|     x -= Int(1);
 | |
|     assert_eq!(x, Int(0));
 | |
| 
 | |
|     // indexed LHS
 | |
|     let mut v = vec![Int(1), Int(2)];
 | |
|     v[0] += Int(2);
 | |
|     assert_eq!(v[0], Int(3));
 | |
| 
 | |
|     // unsized RHS
 | |
|     let mut array = [0, 1, 2];
 | |
|     *Slice::new(&mut array) += 1;
 | |
|     assert_eq!(array[0], 1);
 | |
|     assert_eq!(array[1], 2);
 | |
|     assert_eq!(array[2], 3);
 | |
| 
 | |
|     // sized indirection
 | |
|     // check that this does *not* trigger the unused_assignments lint
 | |
|     let mut array = [0, 1, 2];
 | |
|     let mut view = View(&mut array);
 | |
|     view += 1;
 | |
| }
 | |
| 
 | |
| impl AddAssign for Int {
 | |
|     fn add_assign(&mut self, rhs: Int) {
 | |
|         self.0 += rhs.0;
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl BitAndAssign for Int {
 | |
|     fn bitand_assign(&mut self, rhs: Int) {
 | |
|         self.0 &= rhs.0;
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl BitOrAssign for Int {
 | |
|     fn bitor_assign(&mut self, rhs: Int) {
 | |
|         self.0 |= rhs.0;
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl BitXorAssign for Int {
 | |
|     fn bitxor_assign(&mut self, rhs: Int) {
 | |
|         self.0 ^= rhs.0;
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl DivAssign for Int {
 | |
|     fn div_assign(&mut self, rhs: Int) {
 | |
|         self.0 /= rhs.0;
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl MulAssign for Int {
 | |
|     fn mul_assign(&mut self, rhs: Int) {
 | |
|         self.0 *= rhs.0;
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl RemAssign for Int {
 | |
|     fn rem_assign(&mut self, rhs: Int) {
 | |
|         self.0 %= rhs.0;
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl ShlAssign<u8> for Int {
 | |
|     fn shl_assign(&mut self, rhs: u8) {
 | |
|         self.0 <<= rhs;
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl ShlAssign<u16> for Int {
 | |
|     fn shl_assign(&mut self, rhs: u16) {
 | |
|         self.0 <<= rhs;
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl ShrAssign<u8> for Int {
 | |
|     fn shr_assign(&mut self, rhs: u8) {
 | |
|         self.0 >>= rhs;
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl ShrAssign<u16> for Int {
 | |
|     fn shr_assign(&mut self, rhs: u16) {
 | |
|         self.0 >>= rhs;
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl SubAssign for Int {
 | |
|     fn sub_assign(&mut self, rhs: Int) {
 | |
|         self.0 -= rhs.0;
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl AddAssign<i32> for Slice {
 | |
|     fn add_assign(&mut self, rhs: i32) {
 | |
|         for lhs in &mut self.0 {
 | |
|             *lhs += rhs;
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl<'a> AddAssign<i32> for View<'a> {
 | |
|     fn add_assign(&mut self, rhs: i32) {
 | |
|         for lhs in self.0.iter_mut() {
 | |
|             *lhs += rhs;
 | |
|         }
 | |
|     }
 | |
| }
 | 
