about summary refs log tree commit diff
path: root/compiler/rustc_parse/src
diff options
context:
space:
mode:
authorMichael Goulet <michael@errs.io>2023-12-05 14:52:43 -0500
committerGitHub <noreply@github.com>2023-12-05 14:52:43 -0500
commitdbcde5717194cf69da909dabf8fff5dbb3634000 (patch)
tree80d33b5d88588a478d6b0ce2c9c6fadf2e505d34 /compiler/rustc_parse/src
parent6fa93e83c96ac3e52e5093687a88ef8f64bd5f47 (diff)
parentd627e2a4e8317fc11ccd69832d482b9ae591084a (diff)
downloadrust-dbcde5717194cf69da909dabf8fff5dbb3634000.tar.gz
rust-dbcde5717194cf69da909dabf8fff5dbb3634000.zip
Rollup merge of #118585 - sjwang05:issue-118564, r=compiler-errors
Fix parser ICE when recovering `dyn`/`impl` after `for<...>`

Fixes #118564
Diffstat (limited to 'compiler/rustc_parse/src')
-rw-r--r--compiler/rustc_parse/src/parser/ty.rs22
1 files changed, 12 insertions, 10 deletions
diff --git a/compiler/rustc_parse/src/parser/ty.rs b/compiler/rustc_parse/src/parser/ty.rs
index b1a57c3dfd9..90e4a2aac83 100644
--- a/compiler/rustc_parse/src/parser/ty.rs
+++ b/compiler/rustc_parse/src/parser/ty.rs
@@ -304,23 +304,25 @@ impl<'a> Parser<'a> {
                 if self.may_recover()
                     && (self.eat_keyword_noexpect(kw::Impl) || self.eat_keyword_noexpect(kw::Dyn))
                 {
-                    let kw = self.prev_token.ident().unwrap().0.name;
+                    let kw = self.prev_token.ident().unwrap().0;
+                    let removal_span = kw.span.with_hi(self.token.span.lo());
+                    let path = self.parse_path(PathStyle::Type)?;
+                    let parse_plus = allow_plus == AllowPlus::Yes && self.check_plus();
+                    let kind =
+                        self.parse_remaining_bounds_path(lifetime_defs, path, lo, parse_plus)?;
                     let mut err = self.sess.create_err(errors::TransposeDynOrImpl {
-                        span: self.prev_token.span,
-                        kw: kw.as_str(),
+                        span: kw.span,
+                        kw: kw.name.as_str(),
                         sugg: errors::TransposeDynOrImplSugg {
-                            removal_span: self.prev_token.span.with_hi(self.token.span.lo()),
+                            removal_span,
                             insertion_span: for_span.shrink_to_lo(),
-                            kw: kw.as_str(),
+                            kw: kw.name.as_str(),
                         },
                     });
-                    let path = self.parse_path(PathStyle::Type)?;
-                    let parse_plus = allow_plus == AllowPlus::Yes && self.check_plus();
-                    let kind =
-                        self.parse_remaining_bounds_path(lifetime_defs, path, lo, parse_plus)?;
+
                     // Take the parsed bare trait object and turn it either
                     // into a `dyn` object or an `impl Trait`.
-                    let kind = match (kind, kw) {
+                    let kind = match (kind, kw.name) {
                         (TyKind::TraitObject(bounds, _), kw::Dyn) => {
                             TyKind::TraitObject(bounds, TraitObjectSyntax::Dyn)
                         }