make error emitted on impl &Trait nicer#106712
Conversation
|
r? @cjgillot (rustbot has picked a reviewer for you, use r? to override) |
|
r? @estebank |
e311816 to
068d03d
Compare
|
Please address the comments above, but you'll have to rebase on top of a fresh master (we've moved tests from |
068d03d to
32b95d7
Compare
|
@estebank I assume you just want me to address fmease's comments, you didn't have any?
|
b316295 to
b244273
Compare
|
Some changes occurred in src/tools/cargo cc @ehuss |
b244273 to
c3c6760
Compare
|
r=me after addressing the last comment (that I hadn't noticed earlier) |
|
@estebank Also, the tests are failing, I have to rewrite my impl. It'll be a bit. |
This comment has been minimized.
This comment has been minimized.
c3c6760 to
46e7961
Compare
estebank
left a comment
There was a problem hiding this comment.
One last nitpick before merging
There was a problem hiding this comment.
| err.span_suggestion( | |
| err.span_suggestion_verbose( |
and then re--bless.
There was a problem hiding this comment.
| let mut err = self.struct_span_err(self.token.span, "expected a trait, found type"); | |
| let mut err = self.struct_span_err(self.token.span, "expected a trait, found type start"); |
Specify "type start" because we haven't parsed a type yet, and the span points at & only, so it would be a "lie" (and potentially confusing) to talk about a type.
There was a problem hiding this comment.
I've done this slightly differently. Instead we will only emit the nice error is there is a proper type, "found type start" seems a bit confusing to me.
46e7961 to
e590b93
Compare
| && let Some(path) = self.recover_path_from_fn() | ||
| { | ||
| path | ||
| } else if !self.token.is_path_start() && self.token.can_begin_type() && let Ok(ty) = self.parse_ty_no_plus() { |
There was a problem hiding this comment.
The issue I'm seeing is that let Ok(ty) = self.parse_ty_no_plus() can fail parsing the type and will be returning an Err(Diagnostic), which gets discarded. If this happens, an ICE will occur. We need to either bubble it up (wich self.parse_ty_no_plus()?, which is fine if slightly misleading) or err.delay_as_bug() it (which isn't great without another mechanism to complain about the parse failure).
There was a problem hiding this comment.
Hmm, what about matching on error and cancelling the diagnostic. I didn't properly realize that it returned a diagnostic, not just an error to be later turned into a diagnostic.
There was a problem hiding this comment.
With my current code the following ICEs:
fn foo<T: &match>() {}if we ? the parse call then we get:
error: expected type, found keyword `match`
--> <anon>:1:12
|
1 | fn foo<T: &match>() {}
| ^^^^^ expected type
I'm happy with this, I don't think it's confusing. We could however add a note, something along the lines of: this error was encountered when trying to recover from a "expected a trait, found type" error before bubbling it up.
There was a problem hiding this comment.
You can do map_err(|mut err| { err.note(..); err })?, but I think even without the extra context this output would be fine.
| // to recover from errors, not make more). | ||
| let path = if self.may_recover() | ||
| && matches!(ty.kind, TyKind::Ptr(..) | TyKind::Ref(..)) | ||
| && let TyKind::Path(_, path) = &ty.peel_refs().kind { |
There was a problem hiding this comment.
| && let TyKind::Path(_, path) = &ty.peel_refs().kind { | |
| && let TyKind::Path(_, path) = &ty.peel_refs().kind | |
| { |
|
@bors r+ |
…iaskrgr Rollup of 7 pull requests Successful merges: - rust-lang#106591 (suggestion for attempted integer identifier in patterns) - rust-lang#106712 (make error emitted on `impl &Trait` nicer) - rust-lang#106829 (Unify `Opaque`/`Projection` handling in region outlives code) - rust-lang#106869 (rustdoc: remove redundant item kind class from `.item-decl > pre`) - rust-lang#106949 (ConstBlocks are poly if their substs are poly) - rust-lang#106953 (Document `EarlyBinder::subst_identity` and `skip_binder`) - rust-lang#106958 (Don't add A-bootstrap to PRs modifying Cargo.lock) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
…macro-is-ok, r=estebank Do not eagerly recover for bad `impl Trait` types in macros Fixes rust-lang#107796 cc rust-lang#106712, `@estebank` and `@Ezrashaw` please make sure to use [`Parser::may_recover`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_parse/parser/struct.Parser.html#method.may_recover) for all eager-token-consuming parser recoveries. This also fixes a separate regression from rust-lang#99915, that was introduced before we added `may_recover` though.
…macro-is-ok, r=estebank Do not eagerly recover for bad `impl Trait` types in macros Fixes rust-lang#107796 cc rust-lang#106712, ``@estebank`` and ``@Ezrashaw`` please make sure to use [`Parser::may_recover`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_parse/parser/struct.Parser.html#method.may_recover) for all eager-token-consuming parser recoveries. This also fixes a separate regression from rust-lang#99915, that was introduced before we added `may_recover` though.
…macro-is-ok, r=estebank Do not eagerly recover for bad `impl Trait` types in macros Fixes rust-lang#107796 cc rust-lang#106712, ```@estebank``` and ```@Ezrashaw``` please make sure to use [`Parser::may_recover`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_parse/parser/struct.Parser.html#method.may_recover) for all eager-token-consuming parser recoveries. This also fixes a separate regression from rust-lang#99915, that was introduced before we added `may_recover` though.
Fixes #106694
Turned out to be simpler than I thought, also added UI test.
Before: (playground)
After: