about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMichael Goulet <michael@errs.io>2025-06-26 17:53:39 +0000
committerMichael Goulet <michael@errs.io>2025-06-26 18:11:14 +0000
commite63921262ccd2ece7e0861d634f111136da1f7da (patch)
tree7fc59636ab2dc9acdaa6013afee3411b268ef8ba
parent94e9973b92c481d20e5fe1466bbc47f818101d5f (diff)
downloadrust-e63921262ccd2ece7e0861d634f111136da1f7da.tar.gz
rust-e63921262ccd2ece7e0861d634f111136da1f7da.zip
Make recovery for enum with struct field a bit more accurate
-rw-r--r--compiler/rustc_parse/src/parser/item.rs3
-rw-r--r--tests/ui/structs-enums/recover-enum-with-bad-where.rs6
-rw-r--r--tests/ui/structs-enums/recover-enum-with-bad-where.stderr10
3 files changed, 18 insertions, 1 deletions
diff --git a/compiler/rustc_parse/src/parser/item.rs b/compiler/rustc_parse/src/parser/item.rs
index 5088caa80f8..9ed7124a11c 100644
--- a/compiler/rustc_parse/src/parser/item.rs
+++ b/compiler/rustc_parse/src/parser/item.rs
@@ -1552,7 +1552,8 @@ impl<'a> Parser<'a> {
             })
             .map_err(|mut err| {
                 err.span_label(ident.span, "while parsing this enum");
-                if self.token == token::Colon {
+                // Try to recover `enum Foo { ident : Ty }`.
+                if self.prev_token.is_non_reserved_ident() && self.token == token::Colon {
                     let snapshot = self.create_snapshot_for_diagnostic();
                     self.bump();
                     match self.parse_ty() {
diff --git a/tests/ui/structs-enums/recover-enum-with-bad-where.rs b/tests/ui/structs-enums/recover-enum-with-bad-where.rs
new file mode 100644
index 00000000000..850ee6caa1a
--- /dev/null
+++ b/tests/ui/structs-enums/recover-enum-with-bad-where.rs
@@ -0,0 +1,6 @@
+pub enum Foo<T>
+where:
+//~^ ERROR expected one of `#`, `{`, lifetime, or type, found `:`
+    T: Missing, {}
+
+fn main() {}
diff --git a/tests/ui/structs-enums/recover-enum-with-bad-where.stderr b/tests/ui/structs-enums/recover-enum-with-bad-where.stderr
new file mode 100644
index 00000000000..6f28ff56bab
--- /dev/null
+++ b/tests/ui/structs-enums/recover-enum-with-bad-where.stderr
@@ -0,0 +1,10 @@
+error: expected one of `#`, `{`, lifetime, or type, found `:`
+  --> $DIR/recover-enum-with-bad-where.rs:2:6
+   |
+LL | pub enum Foo<T>
+   |          --- while parsing this enum
+LL | where:
+   |      ^ expected one of `#`, `{`, lifetime, or type
+
+error: aborting due to 1 previous error
+