1
Fork 0

Improve span handling in parse_expr_bottom.

`parse_expr_bottom` stores `this.token.span` in `lo`, but then fails to
use it in many places where it could. This commit fixes that, and
likewise (to a smaller extent) in `parse_ty_common`.
This commit is contained in:
Nicholas Nethercote 2024-11-28 15:06:37 +11:00
parent 6b6a867ae9
commit 90ad2adfea
3 changed files with 14 additions and 21 deletions

View file

@ -1990,7 +1990,6 @@ impl<'a> Parser<'a> {
/// `await? <expr>`, `await(<expr>)`, and `await { <expr> }`. /// `await? <expr>`, `await(<expr>)`, and `await { <expr> }`.
pub(super) fn recover_incorrect_await_syntax( pub(super) fn recover_incorrect_await_syntax(
&mut self, &mut self,
lo: Span,
await_sp: Span, await_sp: Span,
) -> PResult<'a, P<Expr>> { ) -> PResult<'a, P<Expr>> {
let (hi, expr, is_question) = if self.token == token::Not { let (hi, expr, is_question) = if self.token == token::Not {
@ -1999,8 +1998,8 @@ impl<'a> Parser<'a> {
} else { } else {
self.recover_await_prefix(await_sp)? self.recover_await_prefix(await_sp)?
}; };
let (sp, guar) = self.error_on_incorrect_await(lo, hi, &expr, is_question); let (sp, guar) = self.error_on_incorrect_await(await_sp, hi, &expr, is_question);
let expr = self.mk_expr_err(lo.to(sp), guar); let expr = self.mk_expr_err(await_sp.to(sp), guar);
self.maybe_recover_from_bad_qpath(expr) self.maybe_recover_from_bad_qpath(expr)
} }

View file

@ -1446,34 +1446,31 @@ impl<'a> Parser<'a> {
this.parse_expr_closure() this.parse_expr_closure()
} else { } else {
assert!(this.eat_keyword(kw::For)); assert!(this.eat_keyword(kw::For));
this.parse_expr_for(None, this.prev_token.span) this.parse_expr_for(None, lo)
} }
} else if this.eat_keyword(kw::While) { } else if this.eat_keyword(kw::While) {
this.parse_expr_while(None, this.prev_token.span) this.parse_expr_while(None, lo)
} else if let Some(label) = this.eat_label() { } else if let Some(label) = this.eat_label() {
this.parse_expr_labeled(label, true) this.parse_expr_labeled(label, true)
} else if this.eat_keyword(kw::Loop) { } else if this.eat_keyword(kw::Loop) {
let sp = this.prev_token.span; this.parse_expr_loop(None, lo).map_err(|mut err| {
this.parse_expr_loop(None, this.prev_token.span).map_err(|mut err| { err.span_label(lo, "while parsing this `loop` expression");
err.span_label(sp, "while parsing this `loop` expression");
err err
}) })
} else if this.eat_keyword(kw::Match) { } else if this.eat_keyword(kw::Match) {
let match_sp = this.prev_token.span;
this.parse_expr_match().map_err(|mut err| { this.parse_expr_match().map_err(|mut err| {
err.span_label(match_sp, "while parsing this `match` expression"); err.span_label(lo, "while parsing this `match` expression");
err err
}) })
} else if this.eat_keyword(kw::Unsafe) { } else if this.eat_keyword(kw::Unsafe) {
let sp = this.prev_token.span;
this.parse_expr_block(None, lo, BlockCheckMode::Unsafe(ast::UserProvided)).map_err( this.parse_expr_block(None, lo, BlockCheckMode::Unsafe(ast::UserProvided)).map_err(
|mut err| { |mut err| {
err.span_label(sp, "while parsing this `unsafe` expression"); err.span_label(lo, "while parsing this `unsafe` expression");
err err
}, },
) )
} else if this.check_inline_const(0) { } else if this.check_inline_const(0) {
this.parse_const_block(lo.to(this.token.span), false) this.parse_const_block(lo, false)
} else if this.may_recover() && this.is_do_catch_block() { } else if this.may_recover() && this.is_do_catch_block() {
this.recover_do_catch() this.recover_do_catch()
} else if this.is_try_block() { } else if this.is_try_block() {
@ -1514,7 +1511,7 @@ impl<'a> Parser<'a> {
this.parse_expr_closure() this.parse_expr_closure()
} }
} else if this.eat_keyword_noexpect(kw::Await) { } else if this.eat_keyword_noexpect(kw::Await) {
this.recover_incorrect_await_syntax(lo, this.prev_token.span) this.recover_incorrect_await_syntax(lo)
} else { } else {
this.parse_expr_lit() this.parse_expr_lit()
} }

View file

@ -274,7 +274,6 @@ impl<'a> Parser<'a> {
// Function pointer type // Function pointer type
self.parse_ty_bare_fn(lo, ThinVec::new(), None, recover_return_sign)? self.parse_ty_bare_fn(lo, ThinVec::new(), None, recover_return_sign)?
} else if self.check_keyword(kw::For) { } else if self.check_keyword(kw::For) {
let for_span = self.token.span;
// Function pointer type or bound list (trait object type) starting with a poly-trait. // Function pointer type or bound list (trait object type) starting with a poly-trait.
// `for<'lt> [unsafe] [extern "ABI"] fn (&'lt S) -> T` // `for<'lt> [unsafe] [extern "ABI"] fn (&'lt S) -> T`
// `for<'lt> Trait1<'lt> + Trait2 + 'a` // `for<'lt> Trait1<'lt> + Trait2 + 'a`
@ -302,7 +301,7 @@ impl<'a> Parser<'a> {
kw: kw.name.as_str(), kw: kw.name.as_str(),
sugg: errors::TransposeDynOrImplSugg { sugg: errors::TransposeDynOrImplSugg {
removal_span, removal_span,
insertion_span: for_span.shrink_to_lo(), insertion_span: lo.shrink_to_lo(),
kw: kw.name.as_str(), kw: kw.name.as_str(),
}, },
}); });
@ -345,16 +344,14 @@ impl<'a> Parser<'a> {
// FIXME(c_variadic): Should we just allow `...` syntactically // FIXME(c_variadic): Should we just allow `...` syntactically
// anywhere in a type and use semantic restrictions instead? // anywhere in a type and use semantic restrictions instead?
// NOTE: This may regress certain MBE calls if done incorrectly. // NOTE: This may regress certain MBE calls if done incorrectly.
let guar = self let guar = self.dcx().emit_err(NestedCVariadicType { span: lo });
.dcx()
.emit_err(NestedCVariadicType { span: lo.to(self.prev_token.span) });
TyKind::Err(guar) TyKind::Err(guar)
} }
} }
} else { } else {
let msg = format!("expected type, found {}", super::token_descr(&self.token)); let msg = format!("expected type, found {}", super::token_descr(&self.token));
let mut err = self.dcx().struct_span_err(self.token.span, msg); let mut err = self.dcx().struct_span_err(lo, msg);
err.span_label(self.token.span, "expected type"); err.span_label(lo, "expected type");
return Err(err); return Err(err);
}; };