They can: fn main() { let mut foo = Vec::new(); let bar: &mut Vec = &mut foo; std::panic::catch_unwind(std::panic::AssertUnwindSafe(move || { bar.push(42); panic!(); })).unwrap_err(); assert_eq!(foo[0], 42); println!("Mutable reference crossed panic boundary"); }