-
Notifications
You must be signed in to change notification settings - Fork 12.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Improve error message for opaque captures
- Loading branch information
1 parent
74acabe
commit ffd30e0
Showing
25 changed files
with
150 additions
and
116 deletions.
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,57 +1,26 @@ | ||
A lifetime bound on a trait implementation was captured at an incorrect place. | ||
An `impl Trait` captured a higher-ranked lifetime, which is not supported. | ||
|
||
Currently, `impl Trait` types are only allowed to capture lifetimes from | ||
their parent items, and not from any `for<'a>` binders in scope. | ||
|
||
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(()) | ||
} | ||
trait BorrowInto<'a> { | ||
type Target; | ||
struct Foo; | ||
impl Foo { | ||
fn impl_fn_capture_hrtb_in_impl_trait() | ||
-> Box<for<'a> Id<impl Lt<'a>>> // error! | ||
{ | ||
Box::new(()) | ||
} | ||
fn borrow_into(&'a self) -> Self::Target; | ||
} | ||
``` | ||
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. | ||
impl<'a> BorrowInto<'a> for () { | ||
type Target = &'a (); | ||
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(()) | ||
fn borrow_into(&'a self) -> Self::Target { | ||
self | ||
} | ||
} | ||
struct Foo; | ||
impl Foo { | ||
fn impl_fn_capture_hrtb_in_impl_trait<'b>() | ||
-> Box<for<'a> Id<impl Lt<'b>>> // ok! | ||
{ | ||
Box::new(()) | ||
} | ||
fn opaque() -> impl for<'a> BorrowInto<'a, Target = impl Sized + 'a> { | ||
() | ||
} | ||
``` |
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
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
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
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
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
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
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
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
Oops, something went wrong.