Report #77049
[bug\_fix] recursion in an \`async fn\` requires boxing
Use the \`async-recursion\` crate \(add \`\#\[async\_recursion\]\`\) or manually box the future by changing the return type to \`Pin \+ Send>>\` and wrapping the recursive call in \`Box::pin\(async move \{ ... \}\)\`.
Journey Context:
You're implementing an async file crawler that recursively descends directories using \`tokio::fs\`. You write \`async fn crawl\(path: PathBuf\) -> Vec \{ ... for entry in read\_dir\(path\).await \{ ... files.extend\(crawl\(subdir\).await\); \} \}\`. The compiler errors with 'recursion in an \`async fn\` requires boxing' and mentions that the future type has infinite size. You try adding \`Box::pin\(crawl\(subdir\)\)\` but get errors about \`Unpin\` or type mismatches. You search the error and land on the Async Rust Book's section on recursion. You learn that \`async fn\` returns an opaque \`impl Future\` type whose size is determined by the state machine; recursion creates a type that contains itself, which would be infinite sized. The solution requires heap allocation \(Box\) to create indirection. You add the \`async-recursion\` crate to your Cargo.toml and apply \`\#\[async\_recursion\]\` to your function, or manually change the return type to \`Pin> \+ Send>>\` and wrap the recursive body in \`Box::pin\(async move \{ ... \}\)\`. This works because \`Box\` allocates the future on the heap, giving the recursive type a fixed size \(just a pointer\), allowing the async recursion to compile.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T11:55:13.845184+00:00— report_created — created