Skip to content

Anon lifetime in impl Trait no longer suggests adding a lifetime parameter #100615

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Closed
estebank opened this issue Aug 16, 2022 · 14 comments
Closed
Assignees
Labels
A-diagnostics Area: Messages for errors, warnings, and lints A-lifetimes Area: Lifetimes / regions D-terse Diagnostics: An error or lint that doesn't give enough information about the problem at hand. E-easy Call for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue. E-help-wanted Call for participation: Help is requested to fix this issue. E-mentor Call for participation: This issue has a mentor. Use #t-compiler/help on Zulip for discussion. P-high High priority regression-from-stable-to-stable Performance or correctness regression from one stable version to another. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Milestone

Comments

@estebank
Copy link
Contributor

estebank commented Aug 16, 2022

Given fn foo(_: impl Iterator<Item = &u32>) {}.

In 1.63:

error[E0106]: missing lifetime specifier
 --> src/lib.rs:1:32
  |
1 | fn foo(_: impl Iterator<Item = &u32>) {}
  |                                ^ expected named lifetime parameter
  |
help: consider introducing a named lifetime parameter
  |
1 | fn foo<'a>(_: impl Iterator<Item = &'a u32>) {}
  |       ++++                          ++

In 1.64:

error[E0658]: anonymous lifetimes in `impl Trait` are unstable
 --> src/lib.rs:1:32
  |
1 | fn foo(_: impl Iterator<Item = &u32>) {}
  |                                ^
@estebank estebank added A-diagnostics Area: Messages for errors, warnings, and lints A-lifetimes Area: Lifetimes / regions T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. regression-from-stable-to-beta Performance or correctness regression from stable to beta. D-terse Diagnostics: An error or lint that doesn't give enough information about the problem at hand. labels Aug 16, 2022
@rustbot rustbot added the I-prioritize Issue: Indicates that prioritization has been requested for this issue. label Aug 16, 2022
@TaKO8Ki TaKO8Ki self-assigned this Aug 16, 2022
@apiraino
Copy link
Contributor

WG-prioritization assigning priority (Zulip discussion).

@rustbot label -I-prioritize +P-high

@rustbot rustbot added P-high High priority and removed I-prioritize Issue: Indicates that prioritization has been requested for this issue. labels Aug 17, 2022
@pnkfelix pnkfelix self-assigned this Sep 1, 2022
@pnkfelix
Copy link
Member

pnkfelix commented Sep 1, 2022

self-assigning to ensure we record a cargo-bisect to the injecting PR

@apiraino
Copy link
Contributor

apiraino commented Sep 1, 2022

I went ahead and attempted a bisection. The breadcrumbs seem to lead to rollup of #99231 with possibly #97720 being the patchset where this issue originates cc @cjgillot ?

searched nightlies: from nightly-2022-07-13 to nightly-2022-07-15
regressed nightly: nightly-2022-07-15
searched commit range: 87588a2...c2f428d
regressed commit: f1a8854

bisected with cargo-bisect-rustc v0.6.3

Host triple: x86_64-unknown-linux-gnu
Reproduce with:

cargo bisect-rustc --start 2022-07-13 --end 2022-07-15 --preserve 

@spastorino
Copy link
Member

I'm not sure what would be wrong after @cjgillot change. I think this is exactly the support Camille has added. If you use #![feature(anonymous_lifetime_in_impl_trait)] the example compiles and if you don't the error points to the anonymous lifetime and tells you that you would need the feature flag to support such case.

@cjgillot
Copy link
Contributor

cjgillot commented Sep 2, 2022

Added an explanation in #85417 (comment).
TLDR: I proposed to allow this syntax, we made a feature gate instead, and I forgot to put back the suggestion.

@apiraino
Copy link
Contributor

Visited during last weeks' T-compiler meeting on Zulip, relaying Felix's comment here for visibility:

@cjgillot are you planning to put back the suggestion? Alternatively, do you think that might be a nice small task for a new contributor to pick up?

@Mark-Simulacrum Mark-Simulacrum added this to the 1.64.0 milestone Sep 16, 2022
@wesleywiser wesleywiser added regression-from-stable-to-stable Performance or correctness regression from one stable version to another. and removed regression-from-stable-to-beta Performance or correctness regression from stable to beta. labels Sep 22, 2022
@cjgillot
Copy link
Contributor

This should be an easy enough task for a new contributor. Summary instructions:

  • the feature-gate error is emitted from rustc_resolve::late::lifetimes::resolve_lifetime_ref;
  • the generics of the enclosing item can be accessed by tcx.hir().get_generics(lifetime_ref.hir_id.owner);
  • if that generics struct is Some, this means the item can have generics, not that it actually has;
  • the contained value is a hir::Generics, which should be analysed to know how to suggest: span contains the full <...> span, and params shows how many of them each with their own span;
  • I recommend suggesting the additional lifetime parameter as the first one, to avoid questions about the order of lifetime/type/const parameters.

@cjgillot cjgillot added E-easy Call for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue. E-mentor Call for participation: This issue has a mentor. Use #t-compiler/help on Zulip for discussion. E-help-wanted Call for participation: Help is requested to fix this issue. labels Sep 22, 2022
@Stoozy
Copy link
Contributor

Stoozy commented Sep 26, 2022

Hello, I would like to work on this. So far I've been able to get this kind of output

error[E0106]: missing lifetime specifier
 --> test.rs:1:32
  |
1 | fn foo(_: impl Iterator<Item = & u32>) {}
  |                                ^ expected named lifetime parameter
  |
help: consider introducing a named lifetime parameter
 --> test.rs:1:7
  |
1 | fn foo(_: impl Iterator<Item = & u32>) {}
  |       ^

with the input found in the original message.

I am looping over all generic params and checking if the full <...> span doesn't contain the span associated with the parameter, at which point I try to suggest the introduction of the named lifetime parameter.

I'm looking for a few pointers on:

  • If my logic actually makes sense
  • what other suggestions rustc_resolve::late::lifetimes::resolve_lifetime_ref should handle.
  • how to properly emit the errors/suggestions (I see that late/diagnostics.rs also does similar suggestions but I'm unsure if/how I should use it)

@cjgillot
Copy link
Contributor

@Stoozy could you open a PR with what you have and tag me? Discussing on code will be more concrete and easier.

@Rageking8
Copy link
Contributor

@Stoozy Another friendly tip: when you want to undertake an issue, you should claim the issue first to prevent duplicated effort (Write the command shown below in the target issue as a comment to assign urself). Thanks.

Screenshot_2022-09-26-17-40-49-17_320a9a695de7cdce83ed5281148d6f19.jpg

@estebank
Copy link
Contributor Author

@Stoozy can you call LateResolutionVisitor::suggest_introducing_lifetime (or split part of its body to make it appropriate for this case too) and reuse that logic?

@Stoozy
Copy link
Contributor

Stoozy commented Sep 26, 2022

@rustbot claim

JohnTitor added a commit to JohnTitor/rust that referenced this issue Oct 10, 2022
Trying to suggest additional lifetime parameter

`@cjgillot` This is what I have so far for rust-lang#100615
JohnTitor added a commit to JohnTitor/rust that referenced this issue Oct 10, 2022
Trying to suggest additional lifetime parameter

``@cjgillot`` This is what I have so far for rust-lang#100615
@BGR360
Copy link
Contributor

BGR360 commented Nov 7, 2022

Closed by #102323? Or is there more to do?

@cjgillot
Copy link
Contributor

cjgillot commented Nov 7, 2022

Yes, closed by #102323, and #104048 will handle some suggestion corner cases.

@cjgillot cjgillot closed this as completed Nov 7, 2022
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
A-diagnostics Area: Messages for errors, warnings, and lints A-lifetimes Area: Lifetimes / regions D-terse Diagnostics: An error or lint that doesn't give enough information about the problem at hand. E-easy Call for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue. E-help-wanted Call for participation: Help is requested to fix this issue. E-mentor Call for participation: This issue has a mentor. Use #t-compiler/help on Zulip for discussion. P-high High priority regression-from-stable-to-stable Performance or correctness regression from one stable version to another. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

No branches or pull requests