//@ check-pass #![allow(incomplete_features)] #![feature(move_expr)] use std::sync::Arc; fn main() { let x = Arc::new(String::from("hello")); assert_eq!(Arc::strong_count(&x), 1); let outer = || { assert_eq!(Arc::strong_count(&x), 1); let inner = || move(x.clone()); assert_eq!(Arc::strong_count(&x), 2); let y = inner(); assert_eq!(&*y, "hello"); assert_eq!(Arc::strong_count(&x), 2); drop(y); assert_eq!(Arc::strong_count(&x), 1); }; assert_eq!(Arc::strong_count(&x), 1); // `outer` captures `x` by reference, and `inner` takes ownership of a clone. println!("{x}"); outer(); assert_eq!(Arc::strong_count(&x), 1); }