Microsoft/TypeScript

async code generator does not correctly handle labelled blocks

Open

#50 332 ouverte le 17 août 2022

Voir sur GitHub
 (1 commentaire) (2 réactions) (0 assignés)TypeScript (6 726 forks)batch import
BugDomain: JS EmitHelp Wanted

Métriques du dépôt

Stars
 (48 455 stars)
Métriques de merge PR
 (Merge moyen 6j 17h) (9 PRs mergées en 30 j)

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.

Guide contributeur