In certain cases it is possible for sub-bindings to violate memory safety. Updates to the borrow checker in a future version of Rust may remove this restriction, but for now patterns must be rewritten without sub-bindings.

Before:

match Some("hi".to_string()) {
    ref op_string_ref @ Some(s) => {},
    None => {},
}

After:

match Some("hi".to_string()) {
    Some(ref s) => {
        let op_string_ref = &Some(s);
        // ...
    },
    None => {},
}

The op_string_ref binding has type &Option<&String> in both cases.

See also https://github.com/rust-lang/rust/issues/14587