async fn foo(PAT: [u8; 10]) { /* ... */ }

==>

fn foo(x: [u8; 10]) -> impl Future<...> { // ~~~~~~~~~~~ don't focus on the parameters // ... because // async { let PAT = x; /* ... */ } // the real problem is coming out of the generator // structure here, namely the free variable `x` // is represented as a structural "upvar" // upvar: `x` // and it being moved/copied into the local(s): PAT }

==>

fn foo(x: [u8; 10]) -> impl Future<...> { async {} }

for closures:

fn foo(y: 3) { let f = |z| { ... y ... z ...} // ~~~~~~~~~~~~~~~~~~~~~~ // evaluation of this lambda // is what 1. creates/allocates the "environment" // structure and 2. initializes its values/field ... f(10); }