Oddity with lifetime elision and type aliases
@TKanX is already working on this.
Since Feb 21, 2026.
- Dominant language
- Rust
- Stars
- 119k
- Forks
- 16.1k
- PR merge metrics
- PR metrics pending
Description
In reviewing a test case for,
- https://github.com/rust-lang/rust/pull/138677
- (Which is part of https://github.com/rust-lang/rust/pull/120808.)
I was led to the following oddity:
pub struct W<'a>(&'a ());
pub type Alias<'a> = W<'a>;
impl<'a> Alias<'a> {
fn f1<'x>(self: &W<'a>, x: &'x ()) -> &() { x } //~ `'_ == 'x`, what?
fn f2<'x>(self: &Alias<'a>, x: &'x ()) -> &() { x } //~ `'_ == 'x`, what?
fn f3<'x>(&self, _: &'x ()) -> &() { self.0 } //~ OK.
}
impl<'a> W<'a> {
fn f4<'x>(self: &W<'a>, _: &'x ()) -> &() { self.0 } //~ OK.
fn f5<'x>(self: &Alias<'a>, x: &'x ()) -> &() { x } //~ `'_ == 'x`, what?
fn f6<'x>(&self, _: &'x ()) -> &() { self.0 } //~ OK.
}
This was noticed long ago in https://github.com/rust-lang/rust/pull/60944#issuecomment-495346120, which is presumably when the test case was added, but I can't immediately find later discussion.
The Reference doesn't document this behavior. (The FLS, as best I can tell on a skim, does not document lifetime elision at all.)
If there's a good reason for this as the correct behavior, we should probably write this down in the Reference. Otherwise, I'm going to propose we agree to try to do away with this somehow, if possible, maybe over an edition.
@rustbot labels +C-discussion +T-lang +I-lang-nominated +A-lifetimes
cc @rust-lang/lang @ehuss
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.