diff options
Diffstat (limited to 'compiler/rustc_error_codes/src/error_codes/E0759.md')
-rw-r--r-- | compiler/rustc_error_codes/src/error_codes/E0759.md | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/compiler/rustc_error_codes/src/error_codes/E0759.md b/compiler/rustc_error_codes/src/error_codes/E0759.md new file mode 100644 index 000000000..ce5d42b3c --- /dev/null +++ b/compiler/rustc_error_codes/src/error_codes/E0759.md @@ -0,0 +1,63 @@ +#### 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<dyn Debug> { // 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<dyn Debug + 'static> { // 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<dyn Debug + '_> { + 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<dyn Debug + 'a> { + 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 |