In reviewing a test case for,
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.
}
Playground link
This was noticed long ago in #60944 (comment), 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
In reviewing a test case for,
mismatched-lifetime-syntaxeslint #138677I was led to the following oddity:
Playground link
This was noticed long ago in #60944 (comment), 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