Rust errors / Everything else
Rust compiler error · checked with rustc 1.99.0
Rust error E0733: recursion in an async fn requires boxing
What it meansAn [async] function used recursion without boxing.
What rustc prints
error[E0733]: recursion in an async fn requires boxing --> main.rs:1:1 | 1 | async fn foo(n: usize) { | ^^^^^^^^^^^^^^^^^^^^^^ 2 | if n > 0 { 3 | foo(n - 1).await; | ---------------- recursive call here | = note: a recursive `async fn` call must introduce indirection such as `Box::pin` to avoid an infinitely sized future
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 async function used recursion without boxing.
Erroneous code example:
async fn foo(n: usize) {
if n > 0 {
foo(n - 1).await;
}
}
The recursive invocation can be boxed:
async fn foo(n: usize) {
if n > 0 {
Box::pin(foo(n - 1)).await;
}
}
The Box<...> ensures that the result is of known size, and the pin is required to keep it in the same place in memory.
Alternatively, the body can be boxed:
use std::future::Future;
use std::pin::Pin;
fn foo(n: usize) -> Pin<Box<dyn Future<Output = ()>>> {
Box::pin(async move {
if n > 0 {
foo(n - 1).await;
}
})
}From rustc --explain E0733 (1.99.0), part of the Rust project, MIT or Apache-2.0. Official page.
Related errors
- E0061this function takes N arguments but M were supplied
- E0412cannot find type in this scope
- E0515cannot return reference to local variable
- E0728await is only allowed inside async functions and blocks
- E0727`async` coroutines are not yet supported
- E0752`main` function is not allowed to be `async`
- E0753expected outer doc comment
Up next
Often hit nextE0061: this function takes N arguments but M were suppliedA related error from the same family.Read it next →Did this answer your question?