Skip to content

Reachability analysis of never for yield* is uncheckedΒ #58582

Open
@rixtox

Description

@rixtox

πŸ”Ž Search Terms

reachability never

πŸ•— Version & Regression Information

It's observed in all TS versions.

⏯ Playground Link

https://www.typescriptlang.org/play/?#code/GYVwdgxgLglg9mAVAAjAUwG5oE4AoCUAXMgOJrrYCGUc2APOANZhwDuYANOltgHzIBvAFDJkUABbY2yAOTccMgNxCAvkKGhIsBCgC2lGGAKCRY7AE8To0eZhoANgBMU8vPmWiVyYIcr37lsLWyBAIAM5w9mgAdPZwAOa4Mj5gfgEy7qZqoqFgEVGxCUksUMjYaJQQ4pQARlEZympAA

πŸ’» Code

function* never(): Generator<unknown,never> {
  throw 'never';
}

function* main() {
  try {
    yield* never();
  } finally {
    console.log('finally');
  }
  console.log('not reachable');
}

πŸ™ Actual behavior

No error reported.

πŸ™‚ Expected behavior

There should be an error Unreachable code detected.(7027) at line 11 console.log('not reachable');.

Additional information about the issue

Reachability analysis is working for normal function: https://www.typescriptlang.org/play/?#code/GYVwdgxgLglg9mABGApgNxQJwBQEoBcy6WiA3gFCKJQAWmcA7ogOSoabMDc5AvueaEiwEiALYBDGGDxlK1TAE9ZVKmyx5uVHomBTxAG31KKKxBAQBnOPpQA6fXADm2ZrrAGjzXJsR8q5sCsbeycXMDgoREwUcQgacQAjGy9uPiA

It's broken for Promise and we have another issue tracking that one: #34955

Generator functions are being used as coroutine in libraries like co.js, Effect.js, redux-saga, Effection, and more. It's common to write a coroutine operator that suspend the thread forever, thus taking function never(): Generator<Instruction, never> signature. It would benefit users if the TypeScript control analysis can infer unreachability after yield* never().

Metadata

Metadata

Assignees

Labels

Needs InvestigationThis issue needs a team member to investigate its status.

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions