| use crate::{Diagnostic, DiagnosticCode, DiagnosticsContext}; |
| |
| // Diagnostic: mutable-ref |
| // |
| // This diagnostic is triggered when binding is taken that is both mutable and by-reference. |
| 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}; |
| } |
| } |
| "#, |
| ); |
| } |
| } |