Microsoft/TypeScript

async code generator does not correctly handle labelled blocks

Aberta

#50.332 aberto em 17 de ago. de 2022

 (1 comentário) (2 reações) (0 responsável)TypeScript (13.395 forks)batch import
BugDomain: JS EmitHelp Wanted

Métricas do repositório

Stars
 (108.860 estrelas)
Métricas de merge de PR
 (Métricas PR pendentes)

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.

Guia do colaborador