mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 13:04:42 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			80 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| // run-pass
 | |
| 
 | |
| // This test checks the dynamic semantics and drop order of pattern matching
 | |
| // where a product pattern has both a by-move and by-ref binding.
 | |
| 
 | |
| use std::cell::RefCell;
 | |
| use std::rc::Rc;
 | |
| 
 | |
| struct X {
 | |
|     x: Box<usize>,
 | |
|     d: DropOrderListPtr,
 | |
| }
 | |
| 
 | |
| type DropOrderListPtr = Rc<RefCell<Vec<usize>>>;
 | |
| 
 | |
| impl Drop for X {
 | |
|     fn drop(&mut self) {
 | |
|         self.d.borrow_mut().push(*self.x);
 | |
|     }
 | |
| }
 | |
| 
 | |
| enum DoubleOption<T, U> {
 | |
|     Some2(T, U),
 | |
|     _None2,
 | |
| }
 | |
| 
 | |
| fn main() {
 | |
|     let d: DropOrderListPtr = <_>::default();
 | |
|     {
 | |
|         let mk = |v| X { x: Box::new(v), d: d.clone() };
 | |
|         let check = |a1: &X, a2, b1: &X, b2| {
 | |
|             assert_eq!(*a1.x, a2);
 | |
|             assert_eq!(*b1.x, b2);
 | |
|         };
 | |
| 
 | |
|         let x = DoubleOption::Some2(mk(1), mk(2));
 | |
|         match x {
 | |
|             DoubleOption::Some2(ref a, b) => check(a, 1, &b, 2),
 | |
|             DoubleOption::_None2 => panic!(),
 | |
|         }
 | |
|         let x = DoubleOption::Some2(mk(3), mk(4));
 | |
|         match x {
 | |
|             DoubleOption::Some2(a, ref b) => check(&a, 3, b, 4),
 | |
|             DoubleOption::_None2 => panic!(),
 | |
|         }
 | |
|         match DoubleOption::Some2(mk(5), mk(6)) {
 | |
|             DoubleOption::Some2(ref a, b) => check(a, 5, &b, 6),
 | |
|             DoubleOption::_None2 => panic!(),
 | |
|         }
 | |
|         match DoubleOption::Some2(mk(7), mk(8)) {
 | |
|             DoubleOption::Some2(a, ref b) => check(&a, 7, b, 8),
 | |
|             DoubleOption::_None2 => panic!(),
 | |
|         }
 | |
|         {
 | |
|             let (a, ref b) = (mk(9), mk(10));
 | |
|             let (ref c, d) = (mk(11), mk(12));
 | |
|             check(&a, 9, b, 10);
 | |
|             check(c, 11, &d, 12);
 | |
|         }
 | |
|         fn fun([a, ref mut b, ref xs @ .., ref c, d]: [X; 6]) {
 | |
|             assert_eq!(*a.x, 13);
 | |
|             assert_eq!(*b.x, 14);
 | |
|             assert_eq!(&[*xs[0].x, *xs[1].x], &[15, 16]);
 | |
|             assert_eq!(*c.x, 17);
 | |
|             assert_eq!(*d.x, 18);
 | |
|         }
 | |
|         fun([mk(13), mk(14), mk(15), mk(16), mk(17), mk(18)]);
 | |
| 
 | |
|         let lam = |(a, ref b, c, ref mut d): (X, X, X, X)| {
 | |
|             assert_eq!(*a.x, 19);
 | |
|             assert_eq!(*b.x, 20);
 | |
|             assert_eq!(*c.x, 21);
 | |
|             assert_eq!(*d.x, 22);
 | |
|         };
 | |
|         lam((mk(19), mk(20), mk(21), mk(22)));
 | |
|     }
 | |
|     let expected = [2, 3, 6, 5, 7, 8, 12, 11, 9, 10, 18, 13, 14, 15, 16, 17, 21, 19, 20, 22, 4, 1];
 | |
|     assert_eq!(&*d.borrow(), &expected);
 | |
| }
 | 
