diff options
| author | Mazdak Farrokhzad <twingoow@gmail.com> | 2019-05-02 01:09:29 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-05-02 01:09:29 +0200 |
| commit | 16939a50ea440e72cb6ecefdaabb988addb1ec0e (patch) | |
| tree | e9b880050e2903aee0d12b7b7f4156772bdab0d3 /src/libstd/sys/unix/stack_overflow.rs | |
| parent | 12bf98155249783583a91863c5dccf9e346f1226 (diff) | |
| parent | 1fedb0a20bfe03e1bf7d5c2576806c761b4e3963 (diff) | |
| download | rust-16939a50ea440e72cb6ecefdaabb988addb1ec0e.tar.gz rust-16939a50ea440e72cb6ecefdaabb988addb1ec0e.zip | |
Rollup merge of #60437 - davidtwco:issue-60236, r=nikomatsakis
Ensure that drop order of `async fn` matches `fn` and that users cannot refer to generated arguments.
Fixes #60236 and fixes #60438.
This PR modifies the lowering of `async fn` arguments so that the
drop order matches the equivalent `fn`.
Previously, async function arguments were lowered as shown below:
async fn foo(<pattern>: <ty>) {
async move {
}
} // <-- dropped as you "exit" the fn
// ...becomes...
fn foo(__arg0: <ty>) {
async move {
let <pattern> = __arg0;
} // <-- dropped as you "exit" the async block
}
After this PR, async function arguments will be lowered as:
async fn foo(<pattern>: <ty>, <pattern>: <ty>, <pattern>: <ty>) {
async move {
}
} // <-- dropped as you "exit" the fn
// ...becomes...
fn foo(__arg0: <ty>, __arg1: <ty>, __arg2: <ty>) {
async move {
let __arg2 = __arg2;
let <pattern> = __arg2;
let __arg1 = __arg1;
let <pattern> = __arg1;
let __arg0 = __arg0;
let <pattern> = __arg0;
} // <-- dropped as you "exit" the async block
}
If `<pattern>` is a simple ident, then it is lowered to a single
`let <pattern> = <pattern>;` statement as an optimization.
This PR also stops users from referring to the generated `__argN`
identifiers.
r? @nikomatsakis
Diffstat (limited to 'src/libstd/sys/unix/stack_overflow.rs')
0 files changed, 0 insertions, 0 deletions
