-
Notifications
You must be signed in to change notification settings - Fork 12.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Rollup merge of #70578 - PankajChaudhary5:master, r=GuillaumeGomez
Add long error explanation for E0657 Added proper error explanation for issue E0657 in the Rust compiler. Part of #61137 r? @GuillaumeGomez
- Loading branch information
Showing
3 changed files
with
59 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
A lifetime bound on a trait implementation was captured at an incorrect place. | ||
|
||
Erroneous code example: | ||
|
||
```compile_fail,E0657 | ||
trait Id<T> {} | ||
trait Lt<'a> {} | ||
impl<'a> Lt<'a> for () {} | ||
impl<T> Id<T> for T {} | ||
fn free_fn_capture_hrtb_in_impl_trait() | ||
-> Box<for<'a> Id<impl Lt<'a>>> // error! | ||
{ | ||
Box::new(()) | ||
} | ||
struct Foo; | ||
impl Foo { | ||
fn impl_fn_capture_hrtb_in_impl_trait() | ||
-> Box<for<'a> Id<impl Lt<'a>>> // error! | ||
{ | ||
Box::new(()) | ||
} | ||
} | ||
``` | ||
|
||
Here, you have used the inappropriate lifetime in the `impl Trait`, | ||
The `impl Trait` can only capture lifetimes bound at the fn or impl | ||
level. | ||
|
||
To fix this we have to define the lifetime at the function or impl | ||
level and use that lifetime in the `impl Trait`. For example you can | ||
define the lifetime at the function: | ||
|
||
``` | ||
trait Id<T> {} | ||
trait Lt<'a> {} | ||
impl<'a> Lt<'a> for () {} | ||
impl<T> Id<T> for T {} | ||
fn free_fn_capture_hrtb_in_impl_trait<'b>() | ||
-> Box<for<'a> Id<impl Lt<'b>>> // ok! | ||
{ | ||
Box::new(()) | ||
} | ||
struct Foo; | ||
impl Foo { | ||
fn impl_fn_capture_hrtb_in_impl_trait<'b>() | ||
-> Box<for<'a> Id<impl Lt<'b>>> // ok! | ||
{ | ||
Box::new(()) | ||
} | ||
} | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters