File: drop-order.rs

package info (click to toggle)
rustc 1.85.0%2Bdfsg3-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental, sid, trixie
  • size: 893,396 kB
  • sloc: xml: 158,127; python: 35,830; javascript: 19,497; cpp: 19,002; sh: 17,245; ansic: 13,127; asm: 4,376; makefile: 1,051; perl: 29; lisp: 29; ruby: 19; sql: 11
file content (59 lines) | stat: -rw-r--r-- 1,144 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// check drop order of temporaries create in match guards.
// For normal guards all temporaries are dropped before the body of the arm.
// For let guards temporaries live until the end of the arm.

//@ run-pass

#![feature(if_let_guard)]
#![allow(irrefutable_let_patterns)]

use std::sync::Mutex;

static A: Mutex<Vec<i32>> = Mutex::new(Vec::new());

struct D(i32);

fn make_d(x: i32) -> D {
    A.lock().unwrap().push(x);
    D(x)
}

impl Drop for D {
    fn drop(&mut self) {
        A.lock().unwrap().push(!self.0);
    }
}

fn if_guard(num: i32) {
    let _d = make_d(1);
    match num {
        1 | 2 if make_d(2).0 == 2 => {
            make_d(3);
        }
        _ => {}
    }
}

fn if_let_guard(num: i32) {
    let _d = make_d(1);
    match num {
        1 | 2 if let D(ref _x) = make_d(2) => {
            make_d(3);
        }
        _ => {}
    }
}

fn main() {
    if_guard(1);
    if_guard(2);
    if_let_guard(1);
    if_let_guard(2);
    let expected =  [
        1, 2, !2, 3, !3, !1,
        1, 2, !2, 3, !3, !1,
        1, 2, 3, !3, !2, !1,
        1, 2, 3, !3, !2, !1,
    ];
    assert_eq!(*A.lock().unwrap(), expected);
}