Rust errors / Ownership and borrowing
Rust compiler error · checked with rustc 1.99.0
Rust error E0316: nested quantification of lifetimes
What it meansA where clause contains a nested quantification over lifetimes.
What rustc prints
error[E0316]: nested quantification of lifetimes
--> main.rs:5:20
|
5 | for<'a> &'a T: for<'b> Tr<'a, 'b>, // error: nested quantification
| ^^^^^^^^^^^^^^^^^^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
A where clause contains a nested quantification over lifetimes.
Erroneous code example:
trait Tr<'a, 'b> {}
fn foo<T>(t: T)
where
for<'a> &'a T: for<'b> Tr<'a, 'b>, // error: nested quantification
{
}
Rust syntax allows lifetime quantifications in two places within where clauses: Quantifying over the trait bound only (as in Ty: for<'l> Trait<'l>) and quantifying over the whole clause (as in for<'l> &'l Ty: Trait<'l>). Using both in the same clause leads to a nested lifetime quantification, which is not supported.
The following example compiles, because the clause with the nested quantification has been rewritten to use only one for<>:
trait Tr<'a, 'b> {}
fn foo<T>(t: T)
where
for<'a, 'b> &'a T: Tr<'a, 'b>, // ok
{
}From rustc --explain E0316 (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
- E0310the parameter type may not live long enough
- E0311the parameter type `T` may not live long enough
- E0373closure may outlive the current function, but it borrows
Up next
Often hit nextE0382: borrow of moved valueA related error from the same family.Read it next →Did this answer your question?