diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 75be36474222f..f98a6358d6c24 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -2182,7 +2182,6 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { }; var anyIterationTypes = createIterationTypes(anyType, anyType, anyType); - var silentNeverIterationTypes = createIterationTypes(silentNeverType, silentNeverType, silentNeverType); var asyncIterationTypesResolver: IterationTypesResolver = { iterableCacheKey: "iterationTypesOfAsyncIterable", @@ -39208,7 +39207,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { const nextTypes: Type[] = []; const isAsync = (getFunctionFlags(func) & FunctionFlags.Async) !== 0; forEachYieldExpression(func.body as Block, yieldExpression => { - const yieldExpressionType = yieldExpression.expression ? checkExpression(yieldExpression.expression, checkMode) : undefinedWideningType; + const yieldExpressionType = yieldExpression.expression ? checkExpression(yieldExpression.expression, checkMode && checkMode & ~CheckMode.SkipGenericFunctions) : undefinedWideningType; pushIfUnique(yieldTypes, getYieldedTypeOfYieldExpression(yieldExpression, yieldExpressionType, anyType, isAsync)); let nextType: Type | undefined; if (yieldExpression.asteriskToken) { @@ -39228,9 +39227,6 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { } function getYieldedTypeOfYieldExpression(node: YieldExpression, expressionType: Type, sentType: Type, isAsync: boolean): Type | undefined { - if (expressionType === silentNeverType) { - return silentNeverType; - } const errorNode = node.expression || node; // A `yield*` expression effectively yields everything that its operand yields const yieldedType = node.asteriskToken ? checkIteratedTypeOrElementType(isAsync ? IterationUse.AsyncYieldStar : IterationUse.YieldStar, expressionType, sentType, errorNode) : expressionType; @@ -45741,9 +45737,6 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { * the `[Symbol.asyncIterator]()` method first, and then the `[Symbol.iterator]()` method. */ function getIterationTypesOfIterable(type: Type, use: IterationUse, errorNode: Node | undefined) { - if (type === silentNeverType) { - return silentNeverIterationTypes; - } if (isTypeAny(type)) { return anyIterationTypes; } diff --git a/tests/baselines/reference/genericCallAtYieldExpressionInGenericCall1.errors.txt b/tests/baselines/reference/genericCallAtYieldExpressionInGenericCall1.errors.txt index 2e11850567bc4..004bb0a139971 100644 --- a/tests/baselines/reference/genericCallAtYieldExpressionInGenericCall1.errors.txt +++ b/tests/baselines/reference/genericCallAtYieldExpressionInGenericCall1.errors.txt @@ -1,7 +1,21 @@ genericCallAtYieldExpressionInGenericCall1.ts(26,25): error TS2488: Type '() => T' must have a '[Symbol.iterator]()' method that returns an iterator. +genericCallAtYieldExpressionInGenericCall1.ts(56,8): error TS2345: Argument of type '(value: T) => Generator' is not assignable to parameter of type '(value: unknown) => Generator'. + Call signature return types 'Generator' and 'Generator' are incompatible. + The types returned by 'next(...)' are incompatible between these types. + Type 'IteratorResult' is not assignable to type 'IteratorResult'. + Type 'IteratorYieldResult' is not assignable to type 'IteratorResult'. + Type 'IteratorYieldResult' is not assignable to type 'IteratorYieldResult'. + Type 'number' is not assignable to type 'never'. +genericCallAtYieldExpressionInGenericCall1.ts(61,8): error TS2345: Argument of type '(value: T) => Generator' is not assignable to parameter of type '(value: unknown) => Generator'. + Call signature return types 'Generator' and 'Generator' are incompatible. + The types returned by 'next(...)' are incompatible between these types. + Type 'IteratorResult' is not assignable to type 'IteratorResult'. + Type 'IteratorYieldResult' is not assignable to type 'IteratorResult'. + Type 'IteratorYieldResult' is not assignable to type 'IteratorYieldResult'. + Type 'number' is not assignable to type 'never'. -==== genericCallAtYieldExpressionInGenericCall1.ts (1 errors) ==== +==== genericCallAtYieldExpressionInGenericCall1.ts (3 errors) ==== declare const inner: { (value: A): { (): A; @@ -31,4 +45,57 @@ genericCallAtYieldExpressionInGenericCall1.ts(26,25): error TS2488: Type '() => ~~~~~~~~~~~~~ !!! error TS2488: Type '() => T' must have a '[Symbol.iterator]()' method that returns an iterator. }); + + declare const inner3: { + (value: A): { + (): A; + [Symbol.iterator](): { + next(...args: ReadonlyArray): IteratorResult; + }; + }; + }; + + declare function outer2(body: (value: A) => Generator): Y; + + // number + const result1 = outer2(function* (value: T) { + yield* inner3(value); + }); + + // number + const result2 = outer2(function* (value: T) { + const x = inner3(value); + yield* x; + }); + + declare function outer3( + body: (value: A) => Generator, + ): void; + + // error + outer3(function* (value: T) { + ~~~~~~~~ +!!! error TS2345: Argument of type '(value: T) => Generator' is not assignable to parameter of type '(value: unknown) => Generator'. +!!! error TS2345: Call signature return types 'Generator' and 'Generator' are incompatible. +!!! error TS2345: The types returned by 'next(...)' are incompatible between these types. +!!! error TS2345: Type 'IteratorResult' is not assignable to type 'IteratorResult'. +!!! error TS2345: Type 'IteratorYieldResult' is not assignable to type 'IteratorResult'. +!!! error TS2345: Type 'IteratorYieldResult' is not assignable to type 'IteratorYieldResult'. +!!! error TS2345: Type 'number' is not assignable to type 'never'. + yield* inner3(value); + }); + + // error + outer3(function* (value: T) { + ~~~~~~~~ +!!! error TS2345: Argument of type '(value: T) => Generator' is not assignable to parameter of type '(value: unknown) => Generator'. +!!! error TS2345: Call signature return types 'Generator' and 'Generator' are incompatible. +!!! error TS2345: The types returned by 'next(...)' are incompatible between these types. +!!! error TS2345: Type 'IteratorResult' is not assignable to type 'IteratorResult'. +!!! error TS2345: Type 'IteratorYieldResult' is not assignable to type 'IteratorResult'. +!!! error TS2345: Type 'IteratorYieldResult' is not assignable to type 'IteratorYieldResult'. +!!! error TS2345: Type 'number' is not assignable to type 'never'. + const x = inner3(value); + yield* x; + }); \ No newline at end of file diff --git a/tests/baselines/reference/genericCallAtYieldExpressionInGenericCall1.symbols b/tests/baselines/reference/genericCallAtYieldExpressionInGenericCall1.symbols index cb6dca78b13bf..544989df3125f 100644 --- a/tests/baselines/reference/genericCallAtYieldExpressionInGenericCall1.symbols +++ b/tests/baselines/reference/genericCallAtYieldExpressionInGenericCall1.symbols @@ -91,3 +91,116 @@ outer(function* (value: T) { }); +declare const inner3: { +>inner3 : Symbol(inner3, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 28, 13)) + + (value: A): { +>A : Symbol(A, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 29, 3)) +>value : Symbol(value, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 29, 6)) +>A : Symbol(A, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 29, 3)) + + (): A; +>A : Symbol(A, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 29, 3)) + + [Symbol.iterator](): { +>[Symbol.iterator] : Symbol([Symbol.iterator], Decl(genericCallAtYieldExpressionInGenericCall1.ts, 30, 10)) +>Symbol.iterator : Symbol(SymbolConstructor.iterator, Decl(lib.es2015.iterable.d.ts, --, --)) +>Symbol : Symbol(Symbol, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2019.symbol.d.ts, --, --)) +>iterator : Symbol(SymbolConstructor.iterator, Decl(lib.es2015.iterable.d.ts, --, --)) + + next(...args: ReadonlyArray): IteratorResult; +>next : Symbol(next, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 31, 26)) +>args : Symbol(args, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 32, 11)) +>ReadonlyArray : Symbol(ReadonlyArray, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2016.array.include.d.ts, --, --) ... and 3 more) +>IteratorResult : Symbol(IteratorResult, Decl(lib.es2015.iterable.d.ts, --, --)) +>A : Symbol(A, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 29, 3)) + + }; + }; +}; + +declare function outer2(body: (value: A) => Generator): Y; +>outer2 : Symbol(outer2, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 35, 2)) +>A : Symbol(A, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 37, 24)) +>Y : Symbol(Y, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 37, 26)) +>body : Symbol(body, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 37, 30)) +>value : Symbol(value, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 37, 37)) +>A : Symbol(A, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 37, 24)) +>Generator : Symbol(Generator, Decl(lib.es2015.generator.d.ts, --, --)) +>Y : Symbol(Y, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 37, 26)) +>Y : Symbol(Y, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 37, 26)) + +// number +const result1 = outer2(function* (value: T) { +>result1 : Symbol(result1, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 40, 5)) +>outer2 : Symbol(outer2, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 35, 2)) +>T : Symbol(T, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 40, 34)) +>value : Symbol(value, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 40, 37)) +>T : Symbol(T, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 40, 34)) + + yield* inner3(value); +>inner3 : Symbol(inner3, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 28, 13)) +>value : Symbol(value, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 40, 37)) + +}); + +// number +const result2 = outer2(function* (value: T) { +>result2 : Symbol(result2, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 45, 5)) +>outer2 : Symbol(outer2, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 35, 2)) +>T : Symbol(T, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 45, 34)) +>value : Symbol(value, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 45, 37)) +>T : Symbol(T, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 45, 34)) + + const x = inner3(value); +>x : Symbol(x, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 46, 7)) +>inner3 : Symbol(inner3, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 28, 13)) +>value : Symbol(value, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 45, 37)) + + yield* x; +>x : Symbol(x, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 46, 7)) + +}); + +declare function outer3( +>outer3 : Symbol(outer3, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 48, 3)) +>A : Symbol(A, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 50, 24)) + + body: (value: A) => Generator, +>body : Symbol(body, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 50, 27)) +>value : Symbol(value, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 51, 9)) +>A : Symbol(A, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 50, 24)) +>Generator : Symbol(Generator, Decl(lib.es2015.generator.d.ts, --, --)) + +): void; + +// error +outer3(function* (value: T) { +>outer3 : Symbol(outer3, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 48, 3)) +>T : Symbol(T, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 55, 18)) +>value : Symbol(value, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 55, 21)) +>T : Symbol(T, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 55, 18)) + + yield* inner3(value); +>inner3 : Symbol(inner3, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 28, 13)) +>value : Symbol(value, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 55, 21)) + +}); + +// error +outer3(function* (value: T) { +>outer3 : Symbol(outer3, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 48, 3)) +>T : Symbol(T, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 60, 18)) +>value : Symbol(value, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 60, 21)) +>T : Symbol(T, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 60, 18)) + + const x = inner3(value); +>x : Symbol(x, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 61, 7)) +>inner3 : Symbol(inner3, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 28, 13)) +>value : Symbol(value, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 60, 21)) + + yield* x; +>x : Symbol(x, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 61, 7)) + +}); + diff --git a/tests/baselines/reference/genericCallAtYieldExpressionInGenericCall1.types b/tests/baselines/reference/genericCallAtYieldExpressionInGenericCall1.types index e0b92b3ccd070..176caa68de2e3 100644 --- a/tests/baselines/reference/genericCallAtYieldExpressionInGenericCall1.types +++ b/tests/baselines/reference/genericCallAtYieldExpressionInGenericCall1.types @@ -47,8 +47,8 @@ outer(function* (value: T) { > : ^^^^ >outer : (body: (value: A) => Generator) => void > : ^ ^^ ^^ ^^^^^ ->function* (value: T) { const result = yield* inner(value); // ok} : (value: T) => Generator -> : ^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>function* (value: T) { const result = yield* inner(value); // ok} : (value: T) => Generator +> : ^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >value : T > : ^ @@ -111,8 +111,8 @@ outer(function* (value: T) { > : ^^^^ >outer : (body: (value: A) => Generator) => void > : ^ ^^ ^^ ^^^^^ ->function* (value: T) { const result = yield* inner2(value); // error} : (value: T) => Generator -> : ^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>function* (value: T) { const result = yield* inner2(value); // error} : (value: T) => Generator +> : ^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >value : T > : ^ @@ -130,3 +130,160 @@ outer(function* (value: T) { }); +declare const inner3: { +>inner3 : (value: A) => { (): A; [Symbol.iterator](): { next(...args: ReadonlyArray): IteratorResult; }; } +> : ^ ^^ ^^ ^^^^^ + + (value: A): { +>value : A +> : ^ + + (): A; + [Symbol.iterator](): { +>[Symbol.iterator] : () => { next(...args: ReadonlyArray): IteratorResult; } +> : ^^^^^^ +>Symbol.iterator : unique symbol +> : ^^^^^^^^^^^^^ +>Symbol : SymbolConstructor +> : ^^^^^^^^^^^^^^^^^ +>iterator : unique symbol +> : ^^^^^^^^^^^^^ + + next(...args: ReadonlyArray): IteratorResult; +>next : (...args: ReadonlyArray) => IteratorResult +> : ^^^^ ^^ ^^^^^ +>args : readonly any[] +> : ^^^^^^^^^^^^^^ + + }; + }; +}; + +declare function outer2(body: (value: A) => Generator): Y; +>outer2 : (body: (value: A) => Generator) => Y +> : ^ ^^ ^^ ^^ ^^^^^ +>body : (value: A) => Generator +> : ^ ^^ ^^^^^ +>value : A +> : ^ + +// number +const result1 = outer2(function* (value: T) { +>result1 : number +> : ^^^^^^ +>outer2(function* (value: T) { yield* inner3(value);}) : number +> : ^^^^^^ +>outer2 : (body: (value: A) => Generator) => Y +> : ^ ^^ ^^ ^^ ^^^^^ +>function* (value: T) { yield* inner3(value);} : (value: T) => Generator +> : ^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>value : T +> : ^ + + yield* inner3(value); +>yield* inner3(value) : T +> : ^ +>inner3(value) : { (): T; [Symbol.iterator](): { next(...args: ReadonlyArray): IteratorResult; }; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>inner3 : (value: A) => { (): A; [Symbol.iterator](): { next(...args: ReadonlyArray): IteratorResult; }; } +> : ^ ^^ ^^ ^^^^^ +>value : T +> : ^ + +}); + +// number +const result2 = outer2(function* (value: T) { +>result2 : number +> : ^^^^^^ +>outer2(function* (value: T) { const x = inner3(value); yield* x;}) : number +> : ^^^^^^ +>outer2 : (body: (value: A) => Generator) => Y +> : ^ ^^ ^^ ^^ ^^^^^ +>function* (value: T) { const x = inner3(value); yield* x;} : (value: T) => Generator +> : ^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>value : T +> : ^ + + const x = inner3(value); +>x : { (): T; [Symbol.iterator](): { next(...args: ReadonlyArray): IteratorResult; }; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>inner3(value) : { (): T; [Symbol.iterator](): { next(...args: ReadonlyArray): IteratorResult; }; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>inner3 : (value: A) => { (): A; [Symbol.iterator](): { next(...args: ReadonlyArray): IteratorResult; }; } +> : ^ ^^ ^^ ^^^^^ +>value : T +> : ^ + + yield* x; +>yield* x : T +> : ^ +>x : { (): T; [Symbol.iterator](): { next(...args: ReadonlyArray): IteratorResult; }; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +}); + +declare function outer3( +>outer3 : (body: (value: A) => Generator) => void +> : ^ ^^ ^^ ^^^^^ + + body: (value: A) => Generator, +>body : (value: A) => Generator +> : ^ ^^ ^^^^^ +>value : A +> : ^ + +): void; + +// error +outer3(function* (value: T) { +>outer3(function* (value: T) { yield* inner3(value);}) : void +> : ^^^^ +>outer3 : (body: (value: A) => Generator) => void +> : ^ ^^ ^^ ^^^^^ +>function* (value: T) { yield* inner3(value);} : (value: T) => Generator +> : ^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>value : T +> : ^ + + yield* inner3(value); +>yield* inner3(value) : T +> : ^ +>inner3(value) : { (): T; [Symbol.iterator](): { next(...args: ReadonlyArray): IteratorResult; }; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>inner3 : (value: A) => { (): A; [Symbol.iterator](): { next(...args: ReadonlyArray): IteratorResult; }; } +> : ^ ^^ ^^ ^^^^^ +>value : T +> : ^ + +}); + +// error +outer3(function* (value: T) { +>outer3(function* (value: T) { const x = inner3(value); yield* x;}) : void +> : ^^^^ +>outer3 : (body: (value: A) => Generator) => void +> : ^ ^^ ^^ ^^^^^ +>function* (value: T) { const x = inner3(value); yield* x;} : (value: T) => Generator +> : ^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>value : T +> : ^ + + const x = inner3(value); +>x : { (): T; [Symbol.iterator](): { next(...args: ReadonlyArray): IteratorResult; }; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>inner3(value) : { (): T; [Symbol.iterator](): { next(...args: ReadonlyArray): IteratorResult; }; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>inner3 : (value: A) => { (): A; [Symbol.iterator](): { next(...args: ReadonlyArray): IteratorResult; }; } +> : ^ ^^ ^^ ^^^^^ +>value : T +> : ^ + + yield* x; +>yield* x : T +> : ^ +>x : { (): T; [Symbol.iterator](): { next(...args: ReadonlyArray): IteratorResult; }; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +}); + diff --git a/tests/baselines/reference/genericCallAtYieldExpressionInGenericCall2.types b/tests/baselines/reference/genericCallAtYieldExpressionInGenericCall2.types index 35d2c2809705b..d4968b29a3cac 100644 --- a/tests/baselines/reference/genericCallAtYieldExpressionInGenericCall2.types +++ b/tests/baselines/reference/genericCallAtYieldExpressionInGenericCall2.types @@ -70,8 +70,8 @@ fn(function* (queue: Enqueue, value: T) { > : ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >fn : >(body: (...args: Args) => Generator) => (...args: Args) => any > : ^ ^^^^^^^^^ ^^ ^^ ^^^^^^^^^ ^^ ^^ ^^^^^ ->function* (queue: Enqueue, value: T) { yield* offer(queue, value);} : (queue: Enqueue, value: T) => Generator -> : ^ ^^ ^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>function* (queue: Enqueue, value: T) { yield* offer(queue, value);} : (queue: Enqueue, value: T) => Generator +> : ^ ^^ ^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >queue : Enqueue > : ^^^^^^^^^^ >value : T diff --git a/tests/cases/compiler/genericCallAtYieldExpressionInGenericCall1.ts b/tests/cases/compiler/genericCallAtYieldExpressionInGenericCall1.ts index cf7f97be34c69..d5e319a954473 100644 --- a/tests/cases/compiler/genericCallAtYieldExpressionInGenericCall1.ts +++ b/tests/cases/compiler/genericCallAtYieldExpressionInGenericCall1.ts @@ -30,3 +30,40 @@ declare const inner2: { outer(function* (value: T) { const result = yield* inner2(value); // error }); + +declare const inner3: { + (value: A): { + (): A; + [Symbol.iterator](): { + next(...args: ReadonlyArray): IteratorResult; + }; + }; +}; + +declare function outer2(body: (value: A) => Generator): Y; + +// number +const result1 = outer2(function* (value: T) { + yield* inner3(value); +}); + +// number +const result2 = outer2(function* (value: T) { + const x = inner3(value); + yield* x; +}); + +declare function outer3( + body: (value: A) => Generator, +): void; + +// error +outer3(function* (value: T) { + yield* inner3(value); +}); + +// error +outer3(function* (value: T) { + const x = inner3(value); + yield* x; +});