diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 0ff82747879..5bf441fc0db 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -22049,17 +22049,16 @@ namespace ts { if (func) { const signature = getSignatureFromDeclaration(func); const returnType = getReturnTypeOfSignature(signature); + const functionFlags = getFunctionFlags(func); + if (functionFlags & FunctionFlags.Generator) { // AsyncGenerator function or Generator function + // A generator does not need its return expressions checked against its return type. + // Instead, the yield expressions are checked against the element type. + // TODO: Check return expressions of generators when return type tracking is added + // for generators. + return; + } if (strictNullChecks || node.expression || returnType.flags & TypeFlags.Never) { const exprType = node.expression ? checkExpressionCached(node.expression) : undefinedType; - const functionFlags = getFunctionFlags(func); - if (functionFlags & FunctionFlags.Generator) { // AsyncGenerator function or Generator function - // A generator does not need its return expressions checked against its return type. - // Instead, the yield expressions are checked against the element type. - // TODO: Check return expressions of generators when return type tracking is added - // for generators. - return; - } - if (func.kind === SyntaxKind.SetAccessor) { if (node.expression) { error(node, Diagnostics.Setters_cannot_return_a_value); diff --git a/tests/baselines/reference/generatorNoImplicitReturns.js b/tests/baselines/reference/generatorNoImplicitReturns.js new file mode 100644 index 00000000000..d43e801ba99 --- /dev/null +++ b/tests/baselines/reference/generatorNoImplicitReturns.js @@ -0,0 +1,17 @@ +//// [generatorNoImplicitReturns.ts] + +function* testGenerator () { + if (Math.random() > 0.5) { + return; + } + yield 'hello'; +} + + +//// [generatorNoImplicitReturns.js] +function* testGenerator() { + if (Math.random() > 0.5) { + return; + } + yield 'hello'; +} diff --git a/tests/baselines/reference/generatorNoImplicitReturns.symbols b/tests/baselines/reference/generatorNoImplicitReturns.symbols new file mode 100644 index 00000000000..d1d9961ae68 --- /dev/null +++ b/tests/baselines/reference/generatorNoImplicitReturns.symbols @@ -0,0 +1,15 @@ +=== tests/cases/conformance/es6/yieldExpressions/generatorNoImplicitReturns.ts === + +function* testGenerator () { +>testGenerator : Symbol(testGenerator, Decl(generatorNoImplicitReturns.ts, 0, 0)) + + if (Math.random() > 0.5) { +>Math.random : Symbol(Math.random, Decl(lib.es5.d.ts, --, --)) +>Math : Symbol(Math, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --)) +>random : Symbol(Math.random, Decl(lib.es5.d.ts, --, --)) + + return; + } + yield 'hello'; +} + diff --git a/tests/baselines/reference/generatorNoImplicitReturns.types b/tests/baselines/reference/generatorNoImplicitReturns.types new file mode 100644 index 00000000000..666ce4db474 --- /dev/null +++ b/tests/baselines/reference/generatorNoImplicitReturns.types @@ -0,0 +1,20 @@ +=== tests/cases/conformance/es6/yieldExpressions/generatorNoImplicitReturns.ts === + +function* testGenerator () { +>testGenerator : () => IterableIterator + + if (Math.random() > 0.5) { +>Math.random() > 0.5 : boolean +>Math.random() : number +>Math.random : () => number +>Math : Math +>random : () => number +>0.5 : 0.5 + + return; + } + yield 'hello'; +>yield 'hello' : any +>'hello' : "hello" +} + diff --git a/tests/cases/conformance/es6/yieldExpressions/generatorNoImplicitReturns.ts b/tests/cases/conformance/es6/yieldExpressions/generatorNoImplicitReturns.ts new file mode 100644 index 00000000000..41445aa4a11 --- /dev/null +++ b/tests/cases/conformance/es6/yieldExpressions/generatorNoImplicitReturns.ts @@ -0,0 +1,10 @@ +// @target: esnext +// @noImplicitReturns: true +// @strictNullChecks: false + +function* testGenerator () { + if (Math.random() > 0.5) { + return; + } + yield 'hello'; +}