Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-diagnostics/src/handlers/pattern_arg_in_extern_fn.rs')
-rw-r--r--crates/ide-diagnostics/src/handlers/pattern_arg_in_extern_fn.rs86
1 files changed, 86 insertions, 0 deletions
diff --git a/crates/ide-diagnostics/src/handlers/pattern_arg_in_extern_fn.rs b/crates/ide-diagnostics/src/handlers/pattern_arg_in_extern_fn.rs
new file mode 100644
index 0000000000..36031865fc
--- /dev/null
+++ b/crates/ide-diagnostics/src/handlers/pattern_arg_in_extern_fn.rs
@@ -0,0 +1,86 @@
+use crate::{Diagnostic, DiagnosticCode, DiagnosticsContext};
+
+// Diagnostic: pattern-arg-in-extern-fn
+//
+// This diagnostic is triggered if a pattern was declared as an argument in a foreign function declaration.
+pub(crate) fn pattern_arg_in_extern_fn(
+ ctx: &DiagnosticsContext<'_>,
+ d: &hir::PatternArgInExternFn,
+) -> Diagnostic {
+ Diagnostic::new_with_syntax_node_ptr(
+ ctx,
+ DiagnosticCode::RustcHardError("E0130"),
+ "patterns aren't allowed in foreign function declarations",
+ d.node.map(Into::into),
+ )
+ .stable()
+}
+
+#[cfg(test)]
+mod tests {
+ use crate::tests::check_diagnostics;
+
+ #[test]
+ fn tuple_pattern() {
+ check_diagnostics(
+ r#"
+unsafe extern { fn foo((a, b): (u32, u32)); }
+ // ^^^^^^ error: patterns aren't allowed in foreign function declarations
+ "#,
+ );
+ }
+
+ #[test]
+ fn struct_pattern() {
+ check_diagnostics(
+ r#"
+struct Foo(u32, u32);
+unsafe extern { fn foo(Foo(a, b): Foo); }
+ // ^^^^^^^^^ error: patterns aren't allowed in foreign function declarations
+ "#,
+ );
+
+ check_diagnostics(
+ r#"
+struct Foo{ bar: u32, baz: u32 }
+unsafe extern { fn foo(Foo { bar, baz }: Foo); }
+ // ^^^^^^^^^^^^^^^^ error: patterns aren't allowed in foreign function declarations
+ "#,
+ );
+ }
+
+ #[test]
+ fn pattern_is_second_arg() {
+ check_diagnostics(
+ r#"
+struct Foo(u32, u32);
+unsafe extern { fn foo(okay: u32, Foo(a, b): Foo); }
+ // ^^^^^^^^^ error: patterns aren't allowed in foreign function declarations
+ "#,
+ );
+ }
+
+ #[test]
+ fn non_simple_ident() {
+ check_diagnostics(
+ r#"
+unsafe extern { fn foo(ref a: u32); }
+ // ^^^^^ error: patterns aren't allowed in foreign function declarations
+ "#,
+ );
+
+ check_diagnostics(
+ r#"
+unsafe extern { fn foo(mut a: u32); }
+ // ^^^^^ error: patterns aren't allowed in foreign function declarations
+ "#,
+ );
+
+ check_diagnostics(
+ r#"
+unsafe extern { fn foo(a @ _: u32); }
+ // ^^^^^ error: patterns aren't allowed in foreign function declarations
+ "#,
+ );
+ }
+}