From ce6cfc37d033eb1fb1f2e3af1c17c218917b54ec Mon Sep 17 00:00:00 2001 From: yukang Date: Sat, 13 May 2023 18:06:16 +0800 Subject: [PATCH 1/2] Fix ice caused by shorthand fields in NoFieldsForFnCall --- compiler/rustc_parse/src/parser/expr.rs | 7 +++++++ tests/ui/parser/issues/issue-111416.rs | 4 ++++ tests/ui/parser/issues/issue-111416.stderr | 18 ++++++++++++++++++ 3 files changed, 29 insertions(+) create mode 100644 tests/ui/parser/issues/issue-111416.rs create mode 100644 tests/ui/parser/issues/issue-111416.stderr diff --git a/compiler/rustc_parse/src/parser/expr.rs b/compiler/rustc_parse/src/parser/expr.rs index 887e155426fa1..808bbbdada66f 100644 --- a/compiler/rustc_parse/src/parser/expr.rs +++ b/compiler/rustc_parse/src/parser/expr.rs @@ -1180,6 +1180,13 @@ impl<'a> Parser<'a> { self.restore_snapshot(snapshot); let close_paren = self.prev_token.span; let span = lo.to(close_paren); + // filter shorthand fields + let fields: Vec<_> = fields + .into_iter() + .filter_map( + |field| if !field.is_shorthand { Some(field) } else { None }, + ) + .collect(); if !fields.is_empty() && // `token.kind` should not be compared here. // This is because the `snapshot.token.kind` is treated as the same as diff --git a/tests/ui/parser/issues/issue-111416.rs b/tests/ui/parser/issues/issue-111416.rs new file mode 100644 index 0000000000000..deba8679b1a8e --- /dev/null +++ b/tests/ui/parser/issues/issue-111416.rs @@ -0,0 +1,4 @@ + +fn main() { + let my = monad_bind(mx, T: Try); //~ ERROR invalid `struct` delimiters or `fn` call arguments +} diff --git a/tests/ui/parser/issues/issue-111416.stderr b/tests/ui/parser/issues/issue-111416.stderr new file mode 100644 index 0000000000000..b9e61d70e8167 --- /dev/null +++ b/tests/ui/parser/issues/issue-111416.stderr @@ -0,0 +1,18 @@ +error: invalid `struct` delimiters or `fn` call arguments + --> $DIR/issue-111416.rs:3:14 + | +LL | let my = monad_bind(mx, T: Try); + | ^^^^^^^^^^^^^^^^^^^^^^ + | +help: if `monad_bind` is a struct, use braces as delimiters + | +LL | let my = monad_bind { mx, T: Try }; + | ~ ~ +help: if `monad_bind` is a function, use the arguments directly + | +LL - let my = monad_bind(mx, T: Try); +LL + let my = monad_bind(mx, Try); + | + +error: aborting due to previous error + From 83789b8b068ad38c6a3c937d0a2c6ca64e588c85 Mon Sep 17 00:00:00 2001 From: yukang Date: Sat, 13 May 2023 18:06:58 +0800 Subject: [PATCH 2/2] fmt --- compiler/rustc_parse/src/parser/expr.rs | 9 +++------ tests/ui/parser/issues/issue-111416.rs | 1 - tests/ui/parser/issues/issue-111416.stderr | 2 +- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/compiler/rustc_parse/src/parser/expr.rs b/compiler/rustc_parse/src/parser/expr.rs index 808bbbdada66f..ee712a8e1b5db 100644 --- a/compiler/rustc_parse/src/parser/expr.rs +++ b/compiler/rustc_parse/src/parser/expr.rs @@ -1181,12 +1181,9 @@ impl<'a> Parser<'a> { let close_paren = self.prev_token.span; let span = lo.to(close_paren); // filter shorthand fields - let fields: Vec<_> = fields - .into_iter() - .filter_map( - |field| if !field.is_shorthand { Some(field) } else { None }, - ) - .collect(); + let fields: Vec<_> = + fields.into_iter().filter(|field| !field.is_shorthand).collect(); + if !fields.is_empty() && // `token.kind` should not be compared here. // This is because the `snapshot.token.kind` is treated as the same as diff --git a/tests/ui/parser/issues/issue-111416.rs b/tests/ui/parser/issues/issue-111416.rs index deba8679b1a8e..cfd1b6b99ba76 100644 --- a/tests/ui/parser/issues/issue-111416.rs +++ b/tests/ui/parser/issues/issue-111416.rs @@ -1,4 +1,3 @@ - fn main() { let my = monad_bind(mx, T: Try); //~ ERROR invalid `struct` delimiters or `fn` call arguments } diff --git a/tests/ui/parser/issues/issue-111416.stderr b/tests/ui/parser/issues/issue-111416.stderr index b9e61d70e8167..ddacf4d6dfc31 100644 --- a/tests/ui/parser/issues/issue-111416.stderr +++ b/tests/ui/parser/issues/issue-111416.stderr @@ -1,5 +1,5 @@ error: invalid `struct` delimiters or `fn` call arguments - --> $DIR/issue-111416.rs:3:14 + --> $DIR/issue-111416.rs:2:14 | LL | let my = monad_bind(mx, T: Try); | ^^^^^^^^^^^^^^^^^^^^^^