use crate::{Diagnostic, DiagnosticCode, DiagnosticsContext};
pub(crate) fn fru_in_destructuring_assignment(
ctx: &DiagnosticsContext<'_, '_>,
d: &hir::FruInDestructuringAssignment,
) -> Diagnostic {
Diagnostic::new_with_syntax_node_ptr(
ctx,
DiagnosticCode::SyntaxError,
"functional record updates are not allowed in destructuring assignments",
d.node.map(Into::into),
)
.stable()
}
#[cfg(test)]
mod tests {
use crate::tests::{check_diagnostics, check_diagnostics_with_disabled};
#[test]
fn spread_variable() {
check_diagnostics_with_disabled(
r#"
struct Foo { bar: u32, baz: u32 }
fn test(f: Foo, g: Foo, mut bar: u32, mut baz: u32) {
Foo { ..g } = f;
// ^ error: functional record updates are not allowed in destructuring assignments
Foo { bar, ..g } = f;
// ^ error: functional record updates are not allowed in destructuring assignments
Foo { bar, baz, ..g } = f;
// ^ error: functional record updates are not allowed in destructuring assignments
}
"#,
&["unused_variables"],
);
}
#[test]
fn spread_default() {
check_diagnostics(
r#"
struct Foo { bar: u32, baz: u32 }
fn test(f: Foo) {
Foo { ..Default::default() } = f;
// ^^^^^^^^^^^^^^^^^^ error: functional record updates are not allowed in destructuring assignments
}
"#,
);
}
#[test]
fn spread_struct() {
check_diagnostics(
r#"
struct Foo { bar: u32, baz: u32 }
fn test(f: Foo) {
Foo { ..Foo { bar: 0, baz: 0 } } = f;
// ^^^^^^^^^^^^^^^^^^^^^^ error: functional record updates are not allowed in destructuring assignments
}
"#,
);
}
}