Microsoft/TypeScript
async code generator does not correctly handle labelled blocks
Aperta
#50.332 aperta il 17 ago 2022
BugDomain: JS EmitHelp Wanted
Metriche repository
- Star
- (108.860 stelle)
- Metriche merge PR
- (Metriche PR in attesa)
Descrizione
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.