Do not elide if there's ambiguity in self lifetime.
This makes a small change as requested in code review, such that if there's ambiguity in the self lifetime, we avoid lifetime elision entirely instead of considering using lifetimes from any of the other parameters. For example, impl Something { fn method(self: &Box<&Self>, something_else: &u32) -> &u32 { ... } } in standard Rust would have assumed the return lifetime was that of &Self; with this PR prior to this commit would have chosen the lifetime of 'something_else', and after this commit would give an error message explaining that the lifetime is ambiguous.
This commit is contained in:
parent
8d1958f0d2
commit
e62599f856
@ -2136,8 +2136,10 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
|
||||
// We found `self` elision.
|
||||
Set1::One(lifetime) => Elision::Self_(lifetime),
|
||||
// `self` itself had ambiguous lifetimes, e.g.
|
||||
// &Box<&Self>
|
||||
Set1::Many => Elision::None,
|
||||
// &Box<&Self>. In this case we won't consider
|
||||
// taking an alternative parameter lifetime; just avoid elision
|
||||
// entirely.
|
||||
Set1::Many => Elision::Err,
|
||||
// We do not have `self` elision: disregard the `Elision::Param` that we may
|
||||
// have found.
|
||||
Set1::Empty => Elision::None,
|
||||
|
@ -1,4 +1,3 @@
|
||||
//@ check-pass
|
||||
//@ edition:2018
|
||||
|
||||
#![feature(arbitrary_self_types)]
|
||||
@ -21,22 +20,27 @@ impl Struct {
|
||||
// Test using multiple `&Self`:
|
||||
|
||||
async fn wrap_ref_Self_ref_Self(self: Wrap<&Self, &Self>, f: &u8) -> &u8 {
|
||||
//~^ ERROR missing lifetime specifier
|
||||
f
|
||||
}
|
||||
|
||||
async fn box_wrap_ref_Self_ref_Self(self: Box<Wrap<&Self, &Self>>, f: &u32) -> &u32 {
|
||||
//~^ ERROR missing lifetime specifier
|
||||
f
|
||||
}
|
||||
|
||||
async fn pin_wrap_ref_Self_ref_Self(self: Pin<Wrap<&Self, &Self>>, f: &u32) -> &u32 {
|
||||
//~^ ERROR missing lifetime specifier
|
||||
f
|
||||
}
|
||||
|
||||
async fn box_box_wrap_ref_Self_ref_Self(self: Box<Box<Wrap<&Self, &Self>>>, f: &u32) -> &u32 {
|
||||
//~^ ERROR missing lifetime specifier
|
||||
f
|
||||
}
|
||||
|
||||
async fn box_pin_wrap_ref_Self_ref_Self(self: Box<Pin<Wrap<&Self, &Self>>>, f: &u32) -> &u32 {
|
||||
//~^ ERROR missing lifetime specifier
|
||||
f
|
||||
}
|
||||
}
|
||||
|
63
tests/ui/self/elision/multiple-ref-self-async.stderr
Normal file
63
tests/ui/self/elision/multiple-ref-self-async.stderr
Normal file
@ -0,0 +1,63 @@
|
||||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/multiple-ref-self-async.rs:22:74
|
||||
|
|
||||
LL | async fn wrap_ref_Self_ref_Self(self: Wrap<&Self, &Self>, f: &u8) -> &u8 {
|
||||
| ------------------ --- ^ expected named lifetime parameter
|
||||
|
|
||||
= help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from one of `self`'s 2 lifetimes or `f`
|
||||
help: consider introducing a named lifetime parameter
|
||||
|
|
||||
LL | async fn wrap_ref_Self_ref_Self<'a>(self: Wrap<&'a Self, &'a Self>, f: &'a u8) -> &'a u8 {
|
||||
| ++++ ++ ++ ++ ++
|
||||
|
||||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/multiple-ref-self-async.rs:27:84
|
||||
|
|
||||
LL | async fn box_wrap_ref_Self_ref_Self(self: Box<Wrap<&Self, &Self>>, f: &u32) -> &u32 {
|
||||
| ----------------------- ---- ^ expected named lifetime parameter
|
||||
|
|
||||
= help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from one of `self`'s 2 lifetimes or `f`
|
||||
help: consider introducing a named lifetime parameter
|
||||
|
|
||||
LL | async fn box_wrap_ref_Self_ref_Self<'a>(self: Box<Wrap<&'a Self, &'a Self>>, f: &'a u32) -> &'a u32 {
|
||||
| ++++ ++ ++ ++ ++
|
||||
|
||||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/multiple-ref-self-async.rs:32:84
|
||||
|
|
||||
LL | async fn pin_wrap_ref_Self_ref_Self(self: Pin<Wrap<&Self, &Self>>, f: &u32) -> &u32 {
|
||||
| ----------------------- ---- ^ expected named lifetime parameter
|
||||
|
|
||||
= help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from one of `self`'s 2 lifetimes or `f`
|
||||
help: consider introducing a named lifetime parameter
|
||||
|
|
||||
LL | async fn pin_wrap_ref_Self_ref_Self<'a>(self: Pin<Wrap<&'a Self, &'a Self>>, f: &'a u32) -> &'a u32 {
|
||||
| ++++ ++ ++ ++ ++
|
||||
|
||||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/multiple-ref-self-async.rs:37:93
|
||||
|
|
||||
LL | async fn box_box_wrap_ref_Self_ref_Self(self: Box<Box<Wrap<&Self, &Self>>>, f: &u32) -> &u32 {
|
||||
| ---------------------------- ---- ^ expected named lifetime parameter
|
||||
|
|
||||
= help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from one of `self`'s 2 lifetimes or `f`
|
||||
help: consider introducing a named lifetime parameter
|
||||
|
|
||||
LL | async fn box_box_wrap_ref_Self_ref_Self<'a>(self: Box<Box<Wrap<&'a Self, &'a Self>>>, f: &'a u32) -> &'a u32 {
|
||||
| ++++ ++ ++ ++ ++
|
||||
|
||||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/multiple-ref-self-async.rs:42:93
|
||||
|
|
||||
LL | async fn box_pin_wrap_ref_Self_ref_Self(self: Box<Pin<Wrap<&Self, &Self>>>, f: &u32) -> &u32 {
|
||||
| ---------------------------- ---- ^ expected named lifetime parameter
|
||||
|
|
||||
= help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from one of `self`'s 2 lifetimes or `f`
|
||||
help: consider introducing a named lifetime parameter
|
||||
|
|
||||
LL | async fn box_pin_wrap_ref_Self_ref_Self<'a>(self: Box<Pin<Wrap<&'a Self, &'a Self>>>, f: &'a u32) -> &'a u32 {
|
||||
| ++++ ++ ++ ++ ++
|
||||
|
||||
error: aborting due to 5 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0106`.
|
@ -1,5 +1,3 @@
|
||||
//@ check-pass
|
||||
|
||||
#![feature(arbitrary_self_types)]
|
||||
#![allow(non_snake_case)]
|
||||
|
||||
@ -20,22 +18,27 @@ impl Struct {
|
||||
// Test using multiple `&Self`:
|
||||
|
||||
fn wrap_ref_Self_ref_Self(self: Wrap<&Self, &Self>, f: &u8) -> &u8 {
|
||||
//~^ ERROR missing lifetime specifier
|
||||
f
|
||||
}
|
||||
|
||||
fn box_wrap_ref_Self_ref_Self(self: Box<Wrap<&Self, &Self>>, f: &u32) -> &u32 {
|
||||
//~^ ERROR missing lifetime specifier
|
||||
f
|
||||
}
|
||||
|
||||
fn pin_wrap_ref_Self_ref_Self(self: Pin<Wrap<&Self, &Self>>, f: &u32) -> &u32 {
|
||||
//~^ ERROR missing lifetime specifier
|
||||
f
|
||||
}
|
||||
|
||||
fn box_box_wrap_ref_Self_ref_Self(self: Box<Box<Wrap<&Self, &Self>>>, f: &u32) -> &u32 {
|
||||
//~^ ERROR missing lifetime specifier
|
||||
f
|
||||
}
|
||||
|
||||
fn box_pin_wrap_ref_Self_ref_Self(self: Box<Pin<Wrap<&Self, &Self>>>, f: &u32) -> &u32 {
|
||||
//~^ ERROR missing lifetime specifier
|
||||
f
|
||||
}
|
||||
}
|
||||
|
63
tests/ui/self/elision/multiple-ref-self.stderr
Normal file
63
tests/ui/self/elision/multiple-ref-self.stderr
Normal file
@ -0,0 +1,63 @@
|
||||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/multiple-ref-self.rs:20:68
|
||||
|
|
||||
LL | fn wrap_ref_Self_ref_Self(self: Wrap<&Self, &Self>, f: &u8) -> &u8 {
|
||||
| ------------------ --- ^ expected named lifetime parameter
|
||||
|
|
||||
= help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from one of `self`'s 2 lifetimes or `f`
|
||||
help: consider introducing a named lifetime parameter
|
||||
|
|
||||
LL | fn wrap_ref_Self_ref_Self<'a>(self: Wrap<&'a Self, &'a Self>, f: &'a u8) -> &'a u8 {
|
||||
| ++++ ++ ++ ++ ++
|
||||
|
||||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/multiple-ref-self.rs:25:78
|
||||
|
|
||||
LL | fn box_wrap_ref_Self_ref_Self(self: Box<Wrap<&Self, &Self>>, f: &u32) -> &u32 {
|
||||
| ----------------------- ---- ^ expected named lifetime parameter
|
||||
|
|
||||
= help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from one of `self`'s 2 lifetimes or `f`
|
||||
help: consider introducing a named lifetime parameter
|
||||
|
|
||||
LL | fn box_wrap_ref_Self_ref_Self<'a>(self: Box<Wrap<&'a Self, &'a Self>>, f: &'a u32) -> &'a u32 {
|
||||
| ++++ ++ ++ ++ ++
|
||||
|
||||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/multiple-ref-self.rs:30:78
|
||||
|
|
||||
LL | fn pin_wrap_ref_Self_ref_Self(self: Pin<Wrap<&Self, &Self>>, f: &u32) -> &u32 {
|
||||
| ----------------------- ---- ^ expected named lifetime parameter
|
||||
|
|
||||
= help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from one of `self`'s 2 lifetimes or `f`
|
||||
help: consider introducing a named lifetime parameter
|
||||
|
|
||||
LL | fn pin_wrap_ref_Self_ref_Self<'a>(self: Pin<Wrap<&'a Self, &'a Self>>, f: &'a u32) -> &'a u32 {
|
||||
| ++++ ++ ++ ++ ++
|
||||
|
||||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/multiple-ref-self.rs:35:87
|
||||
|
|
||||
LL | fn box_box_wrap_ref_Self_ref_Self(self: Box<Box<Wrap<&Self, &Self>>>, f: &u32) -> &u32 {
|
||||
| ---------------------------- ---- ^ expected named lifetime parameter
|
||||
|
|
||||
= help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from one of `self`'s 2 lifetimes or `f`
|
||||
help: consider introducing a named lifetime parameter
|
||||
|
|
||||
LL | fn box_box_wrap_ref_Self_ref_Self<'a>(self: Box<Box<Wrap<&'a Self, &'a Self>>>, f: &'a u32) -> &'a u32 {
|
||||
| ++++ ++ ++ ++ ++
|
||||
|
||||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/multiple-ref-self.rs:40:87
|
||||
|
|
||||
LL | fn box_pin_wrap_ref_Self_ref_Self(self: Box<Pin<Wrap<&Self, &Self>>>, f: &u32) -> &u32 {
|
||||
| ---------------------------- ---- ^ expected named lifetime parameter
|
||||
|
|
||||
= help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from one of `self`'s 2 lifetimes or `f`
|
||||
help: consider introducing a named lifetime parameter
|
||||
|
|
||||
LL | fn box_pin_wrap_ref_Self_ref_Self<'a>(self: Box<Pin<Wrap<&'a Self, &'a Self>>>, f: &'a u32) -> &'a u32 {
|
||||
| ++++ ++ ++ ++ ++
|
||||
|
||||
error: aborting due to 5 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0106`.
|
@ -1,5 +1,3 @@
|
||||
//@ run-pass
|
||||
|
||||
#![feature(arbitrary_self_types)]
|
||||
#![allow(non_snake_case)]
|
||||
#![allow(unused)]
|
||||
@ -18,10 +16,12 @@ impl<T, P> Deref for Wrap<T, P> {
|
||||
|
||||
impl Struct {
|
||||
fn ref_box_ref_Self(self: &Box<&Self>, f: &u32) -> &u32 {
|
||||
//~^ ERROR missing lifetime specifier
|
||||
f
|
||||
}
|
||||
|
||||
fn ref_wrap_ref_Self(self: &Wrap<&Self, u32>, f: &u32) -> &u32 {
|
||||
//~^ ERROR missing lifetime specifier
|
||||
f
|
||||
}
|
||||
}
|
||||
|
27
tests/ui/self/elision/ref-self-multi.stderr
Normal file
27
tests/ui/self/elision/ref-self-multi.stderr
Normal file
@ -0,0 +1,27 @@
|
||||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/ref-self-multi.rs:18:56
|
||||
|
|
||||
LL | fn ref_box_ref_Self(self: &Box<&Self>, f: &u32) -> &u32 {
|
||||
| ----------- ---- ^ expected named lifetime parameter
|
||||
|
|
||||
= help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from one of `self`'s 2 lifetimes or `f`
|
||||
help: consider introducing a named lifetime parameter
|
||||
|
|
||||
LL | fn ref_box_ref_Self<'a>(self: &'a Box<&'a Self>, f: &'a u32) -> &'a u32 {
|
||||
| ++++ ++ ++ ++ ++
|
||||
|
||||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/ref-self-multi.rs:23:63
|
||||
|
|
||||
LL | fn ref_wrap_ref_Self(self: &Wrap<&Self, u32>, f: &u32) -> &u32 {
|
||||
| ----------------- ---- ^ expected named lifetime parameter
|
||||
|
|
||||
= help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from one of `self`'s 2 lifetimes or `f`
|
||||
help: consider introducing a named lifetime parameter
|
||||
|
|
||||
LL | fn ref_wrap_ref_Self<'a>(self: &'a Wrap<&'a Self, u32>, f: &'a u32) -> &'a u32 {
|
||||
| ++++ ++ ++ ++ ++
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0106`.
|
Loading…
x
Reference in New Issue
Block a user