about summary refs log tree commit diff
path: root/compiler/rustc_parse/src/parser/item.rs
diff options
context:
space:
mode:
authorardi <ardis@ardi.dev>2024-05-19 15:42:12 +0200
committerardi <ardis@ardi.dev>2024-05-20 21:36:20 +0200
commit972633f53034d7d8d60f4c11b680b3f8f2aff337 (patch)
tree4099fe8d589e39e8aca8b46a87338c67e95212cd /compiler/rustc_parse/src/parser/item.rs
parent474bee7bf540db9344ca975298b6c1646a74b772 (diff)
downloadrust-972633f53034d7d8d60f4c11b680b3f8f2aff337.tar.gz
rust-972633f53034d7d8d60f4c11b680b3f8f2aff337.zip
Fix parsing of erroneously placed semicolons
Diffstat (limited to 'compiler/rustc_parse/src/parser/item.rs')
-rw-r--r--compiler/rustc_parse/src/parser/item.rs12
1 files changed, 9 insertions, 3 deletions
diff --git a/compiler/rustc_parse/src/parser/item.rs b/compiler/rustc_parse/src/parser/item.rs
index a46c104b6d9..f43ddadc2ea 100644
--- a/compiler/rustc_parse/src/parser/item.rs
+++ b/compiler/rustc_parse/src/parser/item.rs
@@ -58,9 +58,15 @@ impl<'a> Parser<'a> {
         let attrs = self.parse_inner_attributes()?;
 
         let post_attr_lo = self.token.span;
-        let mut items = ThinVec::new();
-        while let Some(item) = self.parse_item(ForceCollect::No)? {
-            self.maybe_consume_incorrect_semicolon(Some(&item));
+        let mut items: ThinVec<P<_>> = ThinVec::new();
+
+        // There shouldn't be any stray semicolons before or after items.
+        // `parse_item` consumes the appropriate semicolons so any leftover is an error.
+        loop {
+            while self.maybe_consume_incorrect_semicolon(items.last().map(|x| &**x)) {} // Eat all bad semicolons
+            let Some(item) = self.parse_item(ForceCollect::No)? else {
+                break;
+            };
             items.push(item);
         }