Microsoft/TypeScript

async code generator does not correctly handle labelled blocks

Open

#50,332 opened on 2022年8月17日

GitHub で見る
 (1 comment) (2 reactions) (0 assignees)TypeScript (6,726 forks)batch import
BugDomain: JS EmitHelp Wanted

Repository metrics

Stars
 (48,455 stars)
PR merge metrics
 (平均マージ 6d 17h) (30d で 9 merged PRs)

説明

Bug Report

When using the "ES5" target, async/await code generation does not correctly handle breaking from labelled blocks.

🔎 Search Terms

break block label async

🕗 Version & Regression Information

  • This is the behavior in every version I tried, and I reviewed the FAQ for entries about everything

⏯ Playground Link

Playground link with relevant code

💻 Code

Compiler options: --lib ES2015,dom --target ES5

async function foo() {
    tmp: {
        for (let x = 0; x < 4; x++)
            if (await Promise.resolve(true))
                break tmp;
        console.log("Impossible");
        throw 0;
    }
    console.log("Success");
}

foo();

🙁 Actual behavior

"Impossible" is logged, because the break statement seems to short-circuit the inner loop

🙂 Expected behavior

"Success" is logged, because the break statement should short-circuit the outer block

Interestingly, it does seem to handle breaking from outer loops (eg adding a superfluous loop, tmp: for (let nvm = 0; nvm < 1; nvm++) ...), but not plain blocks.

コントリビューターガイド