3 // This test checks the dynamic semantics and drop order of pattern matching
4 // where a product pattern has both a by-move and by-ref binding.
6 use std::cell::RefCell;
14 type DropOrderListPtr = Rc<RefCell<Vec<usize>>>;
18 self.d.borrow_mut().push(*self.x);
22 enum DoubleOption<T, U> {
28 let d: DropOrderListPtr = <_>::default();
30 let mk = |v| X { x: Box::new(v), d: d.clone() };
31 let check = |a1: &X, a2, b1: &X, b2| {
32 assert_eq!(*a1.x, a2);
33 assert_eq!(*b1.x, b2);
36 let x = DoubleOption::Some2(mk(1), mk(2));
38 DoubleOption::Some2(ref a, b) => check(a, 1, &b, 2),
39 DoubleOption::_None2 => panic!(),
41 let x = DoubleOption::Some2(mk(3), mk(4));
43 DoubleOption::Some2(a, ref b) => check(&a, 3, b, 4),
44 DoubleOption::_None2 => panic!(),
46 match DoubleOption::Some2(mk(5), mk(6)) {
47 DoubleOption::Some2(ref a, b) => check(a, 5, &b, 6),
48 DoubleOption::_None2 => panic!(),
50 match DoubleOption::Some2(mk(7), mk(8)) {
51 DoubleOption::Some2(a, ref b) => check(&a, 7, b, 8),
52 DoubleOption::_None2 => panic!(),
55 let (a, ref b) = (mk(9), mk(10));
56 let (ref c, d) = (mk(11), mk(12));
60 fn fun([a, ref mut b, ref xs @ .., ref c, d]: [X; 6]) {
63 assert_eq!(&[*xs[0].x, *xs[1].x], &[15, 16]);
67 fun([mk(13), mk(14), mk(15), mk(16), mk(17), mk(18)]);
69 let lam = |(a, ref b, c, ref mut d): (X, X, X, X)| {
75 lam((mk(19), mk(20), mk(21), mk(22)));
77 let expected = [2, 3, 6, 5, 7, 8, 12, 11, 9, 10, 18, 13, 14, 15, 16, 17, 21, 19, 20, 22, 4, 1];
78 assert_eq!(&*d.borrow(), &expected);