--- /dev/null
+// Here we check that `_ @ sub` is syntactically invalid
+// and comes with a nice actionable suggestion.
+
+fn main() {}
+
+#[cfg(FALSE)]
+fn wild_before_at_is_bad_syntax() {
+ let _ @ a = 0;
+ //~^ ERROR pattern on wrong side of `@`
+ let _ @ ref a = 0;
+ //~^ ERROR pattern on wrong side of `@`
+ let _ @ ref mut a = 0;
+ //~^ ERROR pattern on wrong side of `@`
+ let _ @ (a, .., b) = (0, 1, 2, 3);
+ //~^ ERROR left-hand side of `@` must be a binding
+}
--- /dev/null
+error: pattern on wrong side of `@`
+ --> $DIR/wild-before-at-syntactically-rejected.rs:8:9
+ |
+LL | let _ @ a = 0;
+ | -^^^-
+ | | |
+ | | binding on the right, should be on the left
+ | pattern on the left, should be on the right
+ | help: switch the order: `a @ _`
+
+error: pattern on wrong side of `@`
+ --> $DIR/wild-before-at-syntactically-rejected.rs:10:9
+ |
+LL | let _ @ ref a = 0;
+ | -^^^-----
+ | | |
+ | | binding on the right, should be on the left
+ | pattern on the left, should be on the right
+ | help: switch the order: `ref a @ _`
+
+error: pattern on wrong side of `@`
+ --> $DIR/wild-before-at-syntactically-rejected.rs:12:9
+ |
+LL | let _ @ ref mut a = 0;
+ | -^^^---------
+ | | |
+ | | binding on the right, should be on the left
+ | pattern on the left, should be on the right
+ | help: switch the order: `ref mut a @ _`
+
+error: left-hand side of `@` must be a binding
+ --> $DIR/wild-before-at-syntactically-rejected.rs:14:9
+ |
+LL | let _ @ (a, .., b) = (0, 1, 2, 3);
+ | -^^^----------
+ | | |
+ | | also a pattern
+ | interpreted as a pattern, not a binding
+ |
+ = note: bindings are `x`, `mut x`, `ref x`, and `ref mut x`
+
+error: aborting due to 4 previous errors
+