Improve parse errors for stray lifetimes in type position by fmease · Pull Request #139854 · rust-lang/rust

added 2 commits

April 15, 2025 10:08
Namely, use a more sensical primary span.
Don't pretty-print AST nodes for the diagnostic message. Why:
* It's lossy (e.g., it doesn't replicate trailing `+`s in trait objects.
* It's prone to leak error nodes (printed as `(/*ERROR*/)`) since
  the LHS can easily represent recovered code (e.g., `fn(i32?) + T`).

@rustbot rustbot added S-waiting-on-review

Status: Awaiting review from the assignee but also interested parties.

T-compiler

Relevant to the compiler team, which will review and decide on the PR/issue.

labels

Apr 15, 2025

@fmease fmease changed the title Improve parse errors for lifetimes in type position Improve parse errors for stray lifetimes in type position

Apr 15, 2025

fmease

fmease

davidtwco

@bors bors added S-waiting-on-bors

Status: Waiting on bors to run and complete tests. Bors will change the label on completion.

and removed S-waiting-on-review

Status: Awaiting review from the assignee but also interested parties.

labels

Apr 16, 2025

bors added a commit to rust-lang-ci/rust that referenced this pull request

Apr 17, 2025
…iaskrgr

Rollup of 9 pull requests

Successful merges:

 - rust-lang#135340 (Add `explicit_extern_abis` Feature and Enforce Explicit ABIs)
 - rust-lang#139440 (rustc_target: RISC-V: feature addition batch 2)
 - rust-lang#139667 (cfi: Remove #[no_sanitize(cfi)] for extern weak functions)
 - rust-lang#139828 (Don't require rigid alias's trait to hold)
 - rust-lang#139854 (Improve parse errors for stray lifetimes in type position)
 - rust-lang#139889 (Clean UI tests 3 of n)
 - rust-lang#139894 (Fix `opt-dist` CLI flag and make it work without LLD)
 - rust-lang#139900 (stepping into impls for normalization is unproductive)
 - rust-lang#139915 (replace some #[rustc_intrinsic] usage with use of the libcore declarations)

r? `@ghost`
`@rustbot` modify labels: rollup

rust-timer added a commit to rust-lang-ci/rust that referenced this pull request

Apr 17, 2025
Rollup merge of rust-lang#139854 - fmease:modern-diag-for-lt-in-ty, r=davidtwco

Improve parse errors for stray lifetimes in type position

While technically & syntactically speaking lifetimes do begin[^1] types in type contexts (this essentially excludes generic argument lists) and require a following `+` to form a complete type (`'a +` denotes a bare trait object type), the likelihood that a user meant to write a lifetime-prefixed bare trait object type in *modern* editions (Rust ≥2021) when placing a lifetime into a type context is incredibly low (they would need to add at least three tokens to turn it into a *semantically* well-formed TOT: `'a` → `dyn 'a + Trait`).

Therefore let's *lie* in modern editions (just like in PR rust-lang#131239, a precedent if you will) by stating "*expected type, found lifetime*" in such cases which is a lot more a approachable, digestible and friendly compared to "*lifetime in trait object type must be followed by `+`*" (as added in PR rust-lang#69760).

I've also added recovery for "ampersand-less" reference types (e.g., `'a ()`, `'a mut Ty`) in modern editions because it was trivial to do and I think it's not unlikely to occur in practice.

Fixes rust-lang#133413.

[^1]: For example, in the context of decl macros, this implies that a lone `'a` always matches syntax fragment `ty` ("even if" there's a later macro matcher expecting syntax fragment `lifetime`). Rephrased, lifetimes (in type contexts) *commit* to the type parser.

@fmease fmease deleted the modern-diag-for-lt-in-ty branch

April 17, 2025 08:12