Rust errors / Ownership and borrowing
Rust compiler error · checked with rustc 1.99.0
Rust error E0657: `impl Trait` cannot capture higher-ranked lifetime from outer `impl Trait`
What it meansAn impl Trait captured a higher-ranked lifetime, which is not supported.
What rustc prints
error[E0657]: `impl Trait` cannot capture higher-ranked lifetime from outer `impl Trait` --> main.rs:15:53 | 15 | fn opaque() -> impl for<'a> BorrowInto<'a, Target = impl Sized + 'a> { | ^^^^^^^^^^^^^-- | | | `impl Trait` implicitly captures all lifetimes in scope | note: lifetime declared here --> main.rs:15:25 | 15 | fn opaque() -> impl for<'a> BorrowInto<'a, Target = impl Sized + 'a> { | ^^
Real output of rustc 1.99.0 compiling the official example below (2021 edition). Your names and line numbers will differ; the first line is the part to match.
The compiler team's explanation
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:
trait BorrowInto<'a> {
type Target;
fn borrow_into(&'a self) -> Self::Target;
}
impl<'a> BorrowInto<'a> for () {
type Target = &'a ();
fn borrow_into(&'a self) -> Self::Target {
self
}
}
fn opaque() -> impl for<'a> BorrowInto<'a, Target = impl Sized + 'a> {
()
}From rustc --explain E0657 (1.99.0), part of the Rust project, MIT or Apache-2.0. Official page.
Related errors
- E0382borrow of moved value
- E0499cannot borrow as mutable more than once at a time
- E0502cannot borrow as mutable because it is also borrowed as immutable
- E0106missing lifetime specifier
- E0626This error occurs because a borrow in a movable coroutine persists across a yield point
- E0637`'_` cannot be used here
- E0700hidden type for `impl Trait<'y>` captures lifetime that does not appear in bounds
- E0712thread-local variable borrowed past end of function
Up next
Often hit nextE0382: borrow of moved valueA related error from the same family.Read it next →Did this answer your question?