2018-11-28 21:05:36 +00:00
|
|
|
// Test the simplest of outlives suggestions.
|
|
|
|
|
|
|
|
fn foo1<'a, 'b>(x: &'a usize) -> &'b usize {
|
|
|
|
x //~ERROR lifetime may not live long enough
|
|
|
|
}
|
|
|
|
|
|
|
|
fn foo2<'a>(x: &'a usize) -> &'static usize {
|
|
|
|
x //~ERROR lifetime may not live long enough
|
|
|
|
}
|
|
|
|
|
|
|
|
fn foo3<'a, 'b>(x: &'a usize, y: &'b usize) -> (&'b usize, &'a usize) {
|
|
|
|
(x, y) //~ERROR lifetime may not live long enough
|
|
|
|
//~^ERROR lifetime may not live long enough
|
|
|
|
}
|
|
|
|
|
|
|
|
fn foo4<'a, 'b, 'c>(x: &'a usize) -> (&'b usize, &'c usize) {
|
|
|
|
// FIXME: ideally, we suggest 'a: 'b + 'c, but as of today (may 04, 2019), the null error
|
|
|
|
// reporting stops after the first error in a MIR def so as not to produce too many errors, so
|
|
|
|
// currently we only report 'a: 'b. The user would then re-run and get another error.
|
|
|
|
(x, x) //~ERROR lifetime may not live long enough
|
|
|
|
}
|
|
|
|
|
|
|
|
struct Foo<'a> {
|
|
|
|
x: &'a usize,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Foo<'static> {
|
|
|
|
pub fn foo<'a>(x: &'a usize) -> Self {
|
|
|
|
Foo { x } //~ERROR lifetime may not live long enough
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
struct Bar<'a> {
|
|
|
|
x: &'a usize,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a> Bar<'a> {
|
|
|
|
pub fn get<'b>(&self) -> &'b usize {
|
|
|
|
self.x //~ERROR lifetime may not live long enough
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// source: https://stackoverflow.com/questions/41417057/why-do-i-get-a-lifetime-error-when-i-use-a-mutable-reference-in-a-struct-instead
|
|
|
|
struct Baz<'a> {
|
|
|
|
x: &'a mut i32,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a> Baz<'a> {
|
|
|
|
fn get<'b>(&'b self) -> &'a i32 {
|
|
|
|
self.x //~ERROR lifetime may not live long enough
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// source: https://stackoverflow.com/questions/41204134/rust-lifetime-error
|
|
|
|
struct Bar2<'a> {
|
|
|
|
bar: &'a str,
|
|
|
|
}
|
|
|
|
impl<'a> Bar2<'a> {
|
|
|
|
fn new(foo: &'a Foo2<'a>) -> Bar2<'a> {
|
|
|
|
Bar2 { bar: foo.raw }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub struct Foo2<'a> {
|
|
|
|
raw: &'a str,
|
|
|
|
cell: std::cell::Cell<&'a str>,
|
|
|
|
}
|
|
|
|
impl<'a> Foo2<'a> {
|
|
|
|
// should not produce outlives suggestions to name 'self
|
|
|
|
fn get_bar(&self) -> Bar2 {
|
2021-12-31 21:55:34 +00:00
|
|
|
Bar2::new(&self) //~ERROR lifetime may not live long enough
|
2018-11-28 21:05:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {}
|