//@ 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(b: Box) -> T { let deref!(x) = b; x } fn unbox_2(b: Box<(T,)>) -> T { let (x,) = b; x } fn unbox_separately(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"); }