#### Note: this error code is no longer emitted by the compiler. Return type involving a trait did not require `'static` lifetime. Erroneous code examples: ```compile_fail use std::fmt::Debug; fn foo(x: &i32) -> impl Debug { // error! x } fn bar(x: &i32) -> Box { // error! Box::new(x) } ``` Add `'static` requirement to fix them: ``` # use std::fmt::Debug; fn foo(x: &'static i32) -> impl Debug + 'static { // ok! x } fn bar(x: &'static i32) -> Box { // ok! Box::new(x) } ``` Both [`dyn Trait`] and [`impl Trait`] in return types have an implicit `'static` requirement, meaning that the value implementing them that is being returned has to be either a `'static` borrow or an owned value. In order to change the requirement from `'static` to be a lifetime derived from its arguments, you can add an explicit bound, either to an anonymous lifetime `'_` or some appropriate named lifetime. ``` # use std::fmt::Debug; fn foo(x: &i32) -> impl Debug + '_ { x } fn bar(x: &i32) -> Box { Box::new(x) } ``` These are equivalent to the following explicit lifetime annotations: ``` # use std::fmt::Debug; fn foo<'a>(x: &'a i32) -> impl Debug + 'a { x } fn bar<'a>(x: &'a i32) -> Box { Box::new(x) } ``` [`dyn Trait`]: https://doc.rust-lang.org/book/ch17-02-trait-objects.html#using-trait-objects-that-allow-for-values-of-different-types [`impl Trait`]: https://doc.rust-lang.org/book/ch10-02-traits.html#returning-types-that-implement-traits