// edition:2018 // Check that lifetime resolver enforces the lifetime name scoping // rules correctly in various scenarios. struct Foo<'a> { x: &'a isize } impl<'a> Foo<'a> { // &'a is inherited: fn m1(&self, arg: &'a isize) { } fn m2(&'a self) { } fn m3(&self, arg: Foo<'a>) { } // &'b is not: fn m4(&self, arg: &'b isize) { } //~ ERROR undeclared lifetime fn m5(&'b self) { } //~ ERROR undeclared lifetime fn m6(&self, arg: Foo<'b>) { } //~ ERROR undeclared lifetime } fn bar<'a>(x: &'a isize) { // &'a is visible to code: let y: &'a isize = x; // &'a is not visible to *items*: type X = Option<&'a isize>; //~ ERROR can't use generic parameters from outer item enum E { E1(&'a isize) //~ ERROR can't use generic parameters from outer item } struct S { f: &'a isize //~ ERROR can't use generic parameters from outer item } fn f(a: &'a isize) { } //~ ERROR can't use generic parameters from outer item // &'a CAN be declared on functions and used then: fn g<'a>(a: &'a isize) { } // OK fn h(a: Box FnOnce(&'a isize)>) { } // OK } // Test nesting of lifetimes in fn type declarations fn fn_types(a: &'a isize, //~ ERROR undeclared lifetime b: Box FnOnce(&'a isize, &'b isize, //~ ERROR undeclared lifetime Box FnOnce(&'a isize, &'b isize)>, &'b isize)>, //~ ERROR undeclared lifetime c: &'a isize) //~ ERROR undeclared lifetime { } struct Bug {} impl Bug { async fn buggy(&self) -> &'a str { //~ ERROR use of undeclared lifetime name `'a` todo!() } } pub fn main() {}