mirror of
https://github.com/rust-lang/rust.git
synced 2026-05-29 20:46:07 +03:00
3e1052c6d5
Show named lifetime in closure upvar diagnostics Fixes rust-lang/rust#153545. When a closure captures a variable whose type involves a named lifetime from the parent function (e.g., `'a`), the borrow checker's region renumbering creates a separate `RegionVid` for each occurrence of the erased lifetime in the closure's upvar type. These new `RegionVid`s have no `external_name`, so diagnostics fall back to synthetic names like `'1`. This PR recovers the original lifetime name by matching the closure's upvar type against the parent function's parameter type (obtained via `liberate_late_bound_regions`). Both types have the same structure but different region representations, the parent has `ReLateParam`/`ReEarlyParam` with real names, the closure has `ReVar` from renumbering. Walking them in parallel with `for_each_free_region` lets us find which named lifetime corresponds to the anonymous `RegionVid`. Before: ```rust error[E0716]: temporary value dropped while borrowed --> test.rs:11:21 | 6 | fn apply<'a>( | -- lifetime `'1` defined here ``` After: ```rust error[E0716]: temporary value dropped while borrowed --> test.rs:11:21 | 6 | fn apply<'a>( | -- lifetime `'a` defined here ``` The fix gracefully falls back to the existing `'1` naming when it can't match, nested closures, local variables (not parameters), destructuring patterns, or partial captures where the type structures diverge.