mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 16:24:46 +00:00
Rollup merge of #89710 - sireliah:e0482, r=GuillaumeGomez
Add long explanation for error E0482 This is longer explanation for error E0482 in the #61137. Please take a look and leave some feedback!
This commit is contained in:
commit
57504aafe8
@ -242,6 +242,7 @@ E0468: include_str!("./error_codes/E0468.md"),
|
|||||||
E0469: include_str!("./error_codes/E0469.md"),
|
E0469: include_str!("./error_codes/E0469.md"),
|
||||||
E0477: include_str!("./error_codes/E0477.md"),
|
E0477: include_str!("./error_codes/E0477.md"),
|
||||||
E0478: include_str!("./error_codes/E0478.md"),
|
E0478: include_str!("./error_codes/E0478.md"),
|
||||||
|
E0482: include_str!("./error_codes/E0482.md"),
|
||||||
E0491: include_str!("./error_codes/E0491.md"),
|
E0491: include_str!("./error_codes/E0491.md"),
|
||||||
E0492: include_str!("./error_codes/E0492.md"),
|
E0492: include_str!("./error_codes/E0492.md"),
|
||||||
E0493: include_str!("./error_codes/E0493.md"),
|
E0493: include_str!("./error_codes/E0493.md"),
|
||||||
@ -599,7 +600,6 @@ E0785: include_str!("./error_codes/E0785.md"),
|
|||||||
// E0479, // the type `..` (provided as the value of a type parameter) is...
|
// E0479, // the type `..` (provided as the value of a type parameter) is...
|
||||||
// E0480, // lifetime of method receiver does not outlive the method call
|
// E0480, // lifetime of method receiver does not outlive the method call
|
||||||
// E0481, // lifetime of function argument does not outlive the function call
|
// E0481, // lifetime of function argument does not outlive the function call
|
||||||
E0482, // lifetime of return value does not outlive the function call
|
|
||||||
// E0483, // lifetime of operand does not outlive the operation
|
// E0483, // lifetime of operand does not outlive the operation
|
||||||
// E0484, // reference is not valid at the time of borrow
|
// E0484, // reference is not valid at the time of borrow
|
||||||
// E0485, // automatically reference is not valid at the time of borrow
|
// E0485, // automatically reference is not valid at the time of borrow
|
||||||
|
73
compiler/rustc_error_codes/src/error_codes/E0482.md
Normal file
73
compiler/rustc_error_codes/src/error_codes/E0482.md
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
A lifetime of a returned value does not outlive the function call.
|
||||||
|
|
||||||
|
Erroneous code example:
|
||||||
|
|
||||||
|
```compile_fail,E0482
|
||||||
|
fn prefix<'a>(
|
||||||
|
words: impl Iterator<Item = &'a str>
|
||||||
|
) -> impl Iterator<Item = String> { // error!
|
||||||
|
words.map(|v| format!("foo-{}", v))
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
To fix this error, make the lifetime of the returned value explicit:
|
||||||
|
|
||||||
|
```
|
||||||
|
fn prefix<'a>(
|
||||||
|
words: impl Iterator<Item = &'a str> + 'a
|
||||||
|
) -> impl Iterator<Item = String> + 'a { // ok!
|
||||||
|
words.map(|v| format!("foo-{}", v))
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The [`impl Trait`] feature in this example uses an implicit `'static` lifetime
|
||||||
|
restriction in the returned type. However the type implementing the `Iterator`
|
||||||
|
passed to the function lives just as long as `'a`, which is not long enough.
|
||||||
|
|
||||||
|
The solution involves adding lifetime bound to both function argument and
|
||||||
|
the return value to make sure that the values inside the iterator
|
||||||
|
are not dropped when the function goes out of the scope.
|
||||||
|
|
||||||
|
An alternative solution would be to guarantee that the `Item` references
|
||||||
|
in the iterator are alive for the whole lifetime of the program.
|
||||||
|
|
||||||
|
```
|
||||||
|
fn prefix(
|
||||||
|
words: impl Iterator<Item = &'static str>
|
||||||
|
) -> impl Iterator<Item = String> { // ok!
|
||||||
|
words.map(|v| format!("foo-{}", v))
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
A similar lifetime problem might arise when returning closures:
|
||||||
|
|
||||||
|
```compile_fail,E0482
|
||||||
|
fn foo(
|
||||||
|
x: &mut Vec<i32>
|
||||||
|
) -> impl FnMut(&mut Vec<i32>) -> &[i32] { // error!
|
||||||
|
|y| {
|
||||||
|
y.append(x);
|
||||||
|
y
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Analogically, a solution here is to use explicit return lifetime
|
||||||
|
and move the ownership of the variable to the closure.
|
||||||
|
|
||||||
|
```
|
||||||
|
fn foo<'a>(
|
||||||
|
x: &'a mut Vec<i32>
|
||||||
|
) -> impl FnMut(&mut Vec<i32>) -> &[i32] + 'a { // ok!
|
||||||
|
move |y| {
|
||||||
|
y.append(x);
|
||||||
|
y
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
To better understand the lifetime treatment in the [`impl Trait`],
|
||||||
|
please see the [RFC 1951].
|
||||||
|
|
||||||
|
[`impl Trait`]: https://doc.rust-lang.org/reference/types/impl-trait.html
|
||||||
|
[RFC 1951]: https://rust-lang.github.io/rfcs/1951-expand-impl-trait.html
|
@ -11,7 +11,7 @@ use regex::Regex;
|
|||||||
// A few of those error codes can't be tested but all the others can and *should* be tested!
|
// A few of those error codes can't be tested but all the others can and *should* be tested!
|
||||||
const EXEMPTED_FROM_TEST: &[&str] = &[
|
const EXEMPTED_FROM_TEST: &[&str] = &[
|
||||||
"E0227", "E0279", "E0280", "E0313", "E0377", "E0461", "E0462", "E0464", "E0465", "E0476",
|
"E0227", "E0279", "E0280", "E0313", "E0377", "E0461", "E0462", "E0464", "E0465", "E0476",
|
||||||
"E0482", "E0514", "E0519", "E0523", "E0554", "E0640", "E0717", "E0729",
|
"E0514", "E0519", "E0523", "E0554", "E0640", "E0717", "E0729",
|
||||||
];
|
];
|
||||||
|
|
||||||
// Some error codes don't have any tests apparently...
|
// Some error codes don't have any tests apparently...
|
||||||
|
Loading…
Reference in New Issue
Block a user