File: deref-box.rs

package info (click to toggle)
rustc 1.88.0%2Bdfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 934,128 kB
  • sloc: xml: 158,127; python: 36,062; javascript: 19,855; sh: 19,700; cpp: 18,947; ansic: 12,993; asm: 4,792; makefile: 690; lisp: 29; perl: 29; ruby: 19; sql: 11
file content (37 lines) | stat: -rw-r--r-- 898 bytes parent folder | download | duplicates (7)
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
//@ run-pass
//! Deref patterns on boxes are lowered using built-in derefs, rather than generic `Deref::deref`
//! and `DerefMut::deref_mut`. Test that they work as expected.

#![feature(deref_patterns)]
#![expect(incomplete_features)]

fn unbox_1<T>(b: Box<T>) -> T {
    let deref!(x) = b;
    x
}

fn unbox_2<T>(b: Box<(T,)>) -> T {
    let (x,) = b;
    x
}

fn unbox_separately<T>(b: Box<(T, T)>) -> (T, T) {
    let (x, _) = b;
    let (_, y) = b;
    (x, y)
}

fn main() {
    // test that deref patterns can move out of boxes
    let b1 = Box::new(0);
    let b2 = Box::new((0,));
    assert_eq!(unbox_1(b1), unbox_2(b2));
    let b3 = Box::new((1, 2));
    assert_eq!(unbox_separately(b3), (1, 2));

    // test that borrowing from a box also works
    let mut b = "hi".to_owned().into_boxed_str();
    let deref!(ref mut s) = b;
    s.make_ascii_uppercase();
    assert_eq!(&*b, "HI");
}