mirror of
https://github.com/rust-lang/rust.git
synced 2025-01-24 05:33:41 +00:00
Auto merge of #15438 - Veykril:eager-parser-stuck, r=Veykril
fix: Fix parser being stuck in eager macro inputs Fixes https://github.com/rust-lang/rust-analyzer/issues/15437
This commit is contained in:
commit
2fbe69d117
@ -505,6 +505,9 @@ impl ExprCollector<'_> {
|
||||
let mut args = Vec::new();
|
||||
let mut arg_types = Vec::new();
|
||||
if let Some(pl) = e.param_list() {
|
||||
let num_params = pl.params().count();
|
||||
args.reserve_exact(num_params);
|
||||
arg_types.reserve_exact(num_params);
|
||||
for param in pl.params() {
|
||||
let pat = this.collect_pat_top(param.pat());
|
||||
let type_ref =
|
||||
|
@ -238,7 +238,7 @@ fn main() {
|
||||
/* error: expected expression */;
|
||||
/* error: expected expression, expected COMMA */;
|
||||
/* error: expected expression */::core::fmt::Arguments::new_v1(&["", ], &[::core::fmt::ArgumentV1::new(&(), ::core::fmt::Display::fmt), ]);
|
||||
/* error: expected expression, expected expression */;
|
||||
/* error: expected expression, expected R_PAREN */;
|
||||
::core::fmt::Arguments::new_v1(&["", ], &[::core::fmt::ArgumentV1::new(&(5), ::core::fmt::Display::fmt), ]);
|
||||
}
|
||||
"##]],
|
||||
|
@ -936,3 +936,41 @@ fn main() {
|
||||
"##]],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn eager_regression_154032() {
|
||||
check(
|
||||
r#"
|
||||
#[rustc_builtin_macro]
|
||||
#[macro_export]
|
||||
macro_rules! format_args {}
|
||||
|
||||
fn main() {
|
||||
format_args /* +errors */ !("{}", &[0 2]);
|
||||
}
|
||||
|
||||
"#,
|
||||
expect![[r##"
|
||||
#[rustc_builtin_macro]
|
||||
#[macro_export]
|
||||
macro_rules! format_args {}
|
||||
|
||||
fn main() {
|
||||
/* error: expected COMMA, expected R_BRACK, expected COMMA, expected COMMA, expected expression, expected R_PAREN *//* parse error: expected COMMA */
|
||||
/* parse error: expected R_BRACK */
|
||||
/* parse error: expected COMMA */
|
||||
/* parse error: expected COMMA */
|
||||
/* parse error: expected expression */
|
||||
/* parse error: expected R_PAREN */
|
||||
/* parse error: expected R_PAREN */
|
||||
/* parse error: expected expression, item or let statement */
|
||||
/* parse error: expected expression, item or let statement */
|
||||
/* parse error: expected expression, item or let statement */
|
||||
/* parse error: expected expression, item or let statement */
|
||||
/* parse error: expected expression, item or let statement */
|
||||
::core::fmt::Arguments::new_v1(&["", ], &[::core::fmt::ArgumentV1::new(&(&[0 2]), ::core::fmt::Display::fmt), ]);
|
||||
}
|
||||
|
||||
"##]],
|
||||
);
|
||||
}
|
||||
|
@ -184,7 +184,9 @@ pub(crate) mod entry {
|
||||
};
|
||||
p.bump_any();
|
||||
while !p.at(EOF) && !p.at(closing_paren_kind) {
|
||||
expressions::expr(p);
|
||||
if expressions::expr(p).is_none() {
|
||||
break;
|
||||
}
|
||||
if !p.at(EOF) && !p.at(closing_paren_kind) {
|
||||
p.expect(T![,]);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user