Microsoft/TypeScript
View on GitHubasync code generator does not correctly handle labelled blocks
Open
#50,332 opened on Aug 17, 2022
BugDomain: JS EmitHelp Wanted
Repository metrics
- Stars
- (48,455 stars)
- PR merge metrics
- (Avg merge 6d 17h) (9 merged PRs in 30d)
Description
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.