summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_error_codes/src/error_codes/E0759.md
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rustc_error_codes/src/error_codes/E0759.md')
-rw-r--r--compiler/rustc_error_codes/src/error_codes/E0759.md63
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