Fix parser being stuck in eager macro inputs
This commit is contained in:
parent
05b0612051
commit
9ac88d8d36
@ -505,6 +505,9 @@ impl ExprCollector<'_> {
|
|||||||
let mut args = Vec::new();
|
let mut args = Vec::new();
|
||||||
let mut arg_types = Vec::new();
|
let mut arg_types = Vec::new();
|
||||||
if let Some(pl) = e.param_list() {
|
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() {
|
for param in pl.params() {
|
||||||
let pat = this.collect_pat_top(param.pat());
|
let pat = this.collect_pat_top(param.pat());
|
||||||
let type_ref =
|
let type_ref =
|
||||||
|
@ -238,7 +238,7 @@ fn main() {
|
|||||||
/* error: expected expression */;
|
/* error: expected expression */;
|
||||||
/* error: expected expression, expected COMMA */;
|
/* error: expected expression, expected COMMA */;
|
||||||
/* error: expected expression */::core::fmt::Arguments::new_v1(&["", ], &[::core::fmt::ArgumentV1::new(&(), ::core::fmt::Display::fmt), ]);
|
/* 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), ]);
|
::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();
|
p.bump_any();
|
||||||
while !p.at(EOF) && !p.at(closing_paren_kind) {
|
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) {
|
if !p.at(EOF) && !p.at(closing_paren_kind) {
|
||||||
p.expect(T![,]);
|
p.expect(T![,]);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user