use crate::{Diagnostic, DiagnosticCode, DiagnosticsContext};
pub(crate) fn mutable_ref_binding(
ctx: &DiagnosticsContext<'_, '_>,
d: &hir::MutableRefBinding,
) -> Diagnostic {
Diagnostic::new_with_syntax_node_ptr(
ctx,
DiagnosticCode::RustcHardError("E0658"),
"bindings cannot be both mutable and by-reference by default in 2024 edition. add experimental #![feature(mut_ref)] for this functionality",
d.pat.map(Into::into),
)
.stable()
}
#[cfg(test)]
mod tests {
use crate::tests::check_diagnostics;
#[test]
fn mutable_ref_binding_missing_feature() {
check_diagnostics(
r#"
//- minicore: option
#![feature(ref_pat_eat_one_layer_2024)]
struct TestStruct {
val: i32
}
fn main() {
let opt_ref = &Some(TestStruct {val: 1});
if let Some(mut x) = opt_ref {
//^^^^^ error: bindings cannot be both mutable and by-reference by default in 2024 edition. add experimental #![feature(mut_ref)] for this functionality
x = &TestStruct{val: 5};
}
}
"#,
);
}
#[test]
fn mutable_ref_binding_with_feature() {
check_diagnostics(
r#"
//- minicore: option
#![feature(ref_pat_eat_one_layer_2024)]
#![feature(mut_ref)]
struct TestStruct {
val: i32
}
fn main() {
let opt_ref = &Some(TestStruct{val: 1});
if let Some(mut x) = opt_ref {
x = &TestStruct{val: 5};
}
}
"#,
);
}
}