Skip to content

Commit 2fbe69d

Browse files
committed
Auto merge of #15438 - Veykril:eager-parser-stuck, r=Veykril
fix: Fix parser being stuck in eager macro inputs Fixes #15437
2 parents 6cf06c1 + 9ac88d8 commit 2fbe69d

File tree

4 files changed

+45
-2
lines changed

4 files changed

+45
-2
lines changed

crates/hir-def/src/body/lower.rs

+3
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,9 @@ impl ExprCollector<'_> {
505505
let mut args = Vec::new();
506506
let mut arg_types = Vec::new();
507507
if let Some(pl) = e.param_list() {
508+
let num_params = pl.params().count();
509+
args.reserve_exact(num_params);
510+
arg_types.reserve_exact(num_params);
508511
for param in pl.params() {
509512
let pat = this.collect_pat_top(param.pat());
510513
let type_ref =

crates/hir-def/src/macro_expansion_tests/builtin_fn_macro.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ fn main() {
238238
/* error: expected expression */;
239239
/* error: expected expression, expected COMMA */;
240240
/* error: expected expression */::core::fmt::Arguments::new_v1(&["", ], &[::core::fmt::ArgumentV1::new(&(), ::core::fmt::Display::fmt), ]);
241-
/* error: expected expression, expected expression */;
241+
/* error: expected expression, expected R_PAREN */;
242242
::core::fmt::Arguments::new_v1(&["", ], &[::core::fmt::ArgumentV1::new(&(5), ::core::fmt::Display::fmt), ]);
243243
}
244244
"##]],

crates/hir-def/src/macro_expansion_tests/mbe/regression.rs

+38
Original file line numberDiff line numberDiff line change
@@ -936,3 +936,41 @@ fn main() {
936936
"##]],
937937
);
938938
}
939+
940+
#[test]
941+
fn eager_regression_154032() {
942+
check(
943+
r#"
944+
#[rustc_builtin_macro]
945+
#[macro_export]
946+
macro_rules! format_args {}
947+
948+
fn main() {
949+
format_args /* +errors */ !("{}", &[0 2]);
950+
}
951+
952+
"#,
953+
expect![[r##"
954+
#[rustc_builtin_macro]
955+
#[macro_export]
956+
macro_rules! format_args {}
957+
958+
fn main() {
959+
/* error: expected COMMA, expected R_BRACK, expected COMMA, expected COMMA, expected expression, expected R_PAREN *//* parse error: expected COMMA */
960+
/* parse error: expected R_BRACK */
961+
/* parse error: expected COMMA */
962+
/* parse error: expected COMMA */
963+
/* parse error: expected expression */
964+
/* parse error: expected R_PAREN */
965+
/* parse error: expected R_PAREN */
966+
/* parse error: expected expression, item or let statement */
967+
/* parse error: expected expression, item or let statement */
968+
/* parse error: expected expression, item or let statement */
969+
/* parse error: expected expression, item or let statement */
970+
/* parse error: expected expression, item or let statement */
971+
::core::fmt::Arguments::new_v1(&["", ], &[::core::fmt::ArgumentV1::new(&(&[0 2]), ::core::fmt::Display::fmt), ]);
972+
}
973+
974+
"##]],
975+
);
976+
}

crates/parser/src/grammar.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,9 @@ pub(crate) mod entry {
184184
};
185185
p.bump_any();
186186
while !p.at(EOF) && !p.at(closing_paren_kind) {
187-
expressions::expr(p);
187+
if expressions::expr(p).is_none() {
188+
break;
189+
}
188190
if !p.at(EOF) && !p.at(closing_paren_kind) {
189191
p.expect(T![,]);
190192
}

0 commit comments

Comments
 (0)