Skip to content

Commit 38d95c8

Browse files
authored
Avoid silentNeverType leaking into generator types inferred based on inner generic calls at yields (#62283)
1 parent 0752278 commit 38d95c8

6 files changed

+382
-15
lines changed

src/compiler/checker.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2189,7 +2189,6 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
21892189
};
21902190

21912191
var anyIterationTypes = createIterationTypes(anyType, anyType, anyType);
2192-
var silentNeverIterationTypes = createIterationTypes(silentNeverType, silentNeverType, silentNeverType);
21932192

21942193
var asyncIterationTypesResolver: IterationTypesResolver = {
21952194
iterableCacheKey: "iterationTypesOfAsyncIterable",
@@ -39230,7 +39229,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3923039229
const nextTypes: Type[] = [];
3923139230
const isAsync = (getFunctionFlags(func) & FunctionFlags.Async) !== 0;
3923239231
forEachYieldExpression(func.body as Block, yieldExpression => {
39233-
let yieldExpressionType = yieldExpression.expression ? checkExpression(yieldExpression.expression, checkMode) : undefinedWideningType;
39232+
let yieldExpressionType = yieldExpression.expression ? checkExpression(yieldExpression.expression, checkMode && checkMode & ~CheckMode.SkipGenericFunctions) : undefinedWideningType;
3923439233
if (yieldExpression.expression && isConstContext(yieldExpression.expression)) {
3923539234
yieldExpressionType = getRegularTypeOfLiteralType(yieldExpressionType);
3923639235
}
@@ -39253,9 +39252,6 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3925339252
}
3925439253

3925539254
function getYieldedTypeOfYieldExpression(node: YieldExpression, expressionType: Type, sentType: Type, isAsync: boolean): Type | undefined {
39256-
if (expressionType === silentNeverType) {
39257-
return silentNeverType;
39258-
}
3925939255
const errorNode = node.expression || node;
3926039256
// A `yield*` expression effectively yields everything that its operand yields
3926139257
const yieldedType = node.asteriskToken ? checkIteratedTypeOrElementType(isAsync ? IterationUse.AsyncYieldStar : IterationUse.YieldStar, expressionType, sentType, errorNode) : expressionType;
@@ -45859,9 +45855,6 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4585945855
*/
4586045856
function getIterationTypesOfIterable(type: Type, use: IterationUse, errorNode: Node | undefined) {
4586145857
type = getReducedType(type);
45862-
if (type === silentNeverType) {
45863-
return silentNeverIterationTypes;
45864-
}
4586545858
if (isTypeAny(type)) {
4586645859
return anyIterationTypes;
4586745860
}

tests/baselines/reference/genericCallAtYieldExpressionInGenericCall1.errors.txt

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,21 @@
11
genericCallAtYieldExpressionInGenericCall1.ts(26,25): error TS2488: Type '() => T' must have a '[Symbol.iterator]()' method that returns an iterator.
2+
genericCallAtYieldExpressionInGenericCall1.ts(56,8): error TS2345: Argument of type '<T>(value: T) => Generator<number, void, any>' is not assignable to parameter of type '(value: unknown) => Generator<never, unknown, unknown>'.
3+
Call signature return types 'Generator<number, void, any>' and 'Generator<never, unknown, unknown>' are incompatible.
4+
The types returned by 'next(...)' are incompatible between these types.
5+
Type 'IteratorResult<number, void>' is not assignable to type 'IteratorResult<never, unknown>'.
6+
Type 'IteratorYieldResult<number>' is not assignable to type 'IteratorResult<never, unknown>'.
7+
Type 'IteratorYieldResult<number>' is not assignable to type 'IteratorYieldResult<never>'.
8+
Type 'number' is not assignable to type 'never'.
9+
genericCallAtYieldExpressionInGenericCall1.ts(61,8): error TS2345: Argument of type '<T>(value: T) => Generator<number, void, any>' is not assignable to parameter of type '(value: unknown) => Generator<never, unknown, unknown>'.
10+
Call signature return types 'Generator<number, void, any>' and 'Generator<never, unknown, unknown>' are incompatible.
11+
The types returned by 'next(...)' are incompatible between these types.
12+
Type 'IteratorResult<number, void>' is not assignable to type 'IteratorResult<never, unknown>'.
13+
Type 'IteratorYieldResult<number>' is not assignable to type 'IteratorResult<never, unknown>'.
14+
Type 'IteratorYieldResult<number>' is not assignable to type 'IteratorYieldResult<never>'.
15+
Type 'number' is not assignable to type 'never'.
216

317

4-
==== genericCallAtYieldExpressionInGenericCall1.ts (1 errors) ====
18+
==== genericCallAtYieldExpressionInGenericCall1.ts (3 errors) ====
519
declare const inner: {
620
<A>(value: A): {
721
(): A;
@@ -31,4 +45,57 @@ genericCallAtYieldExpressionInGenericCall1.ts(26,25): error TS2488: Type '() =>
3145
~~~~~~~~~~~~~
3246
!!! error TS2488: Type '() => T' must have a '[Symbol.iterator]()' method that returns an iterator.
3347
});
48+
49+
declare const inner3: {
50+
<A>(value: A): {
51+
(): A;
52+
[Symbol.iterator](): {
53+
next(...args: ReadonlyArray<any>): IteratorResult<number, A>;
54+
};
55+
};
56+
};
57+
58+
declare function outer2<A, Y>(body: (value: A) => Generator<Y, any, any>): Y;
59+
60+
// number
61+
const result1 = outer2(function* <T>(value: T) {
62+
yield* inner3(value);
63+
});
64+
65+
// number
66+
const result2 = outer2(function* <T>(value: T) {
67+
const x = inner3(value);
68+
yield* x;
69+
});
70+
71+
declare function outer3<A>(
72+
body: (value: A) => Generator<never, unknown, unknown>,
73+
): void;
74+
75+
// error
76+
outer3(function* <T>(value: T) {
77+
~~~~~~~~
78+
!!! error TS2345: Argument of type '<T>(value: T) => Generator<number, void, any>' is not assignable to parameter of type '(value: unknown) => Generator<never, unknown, unknown>'.
79+
!!! error TS2345: Call signature return types 'Generator<number, void, any>' and 'Generator<never, unknown, unknown>' are incompatible.
80+
!!! error TS2345: The types returned by 'next(...)' are incompatible between these types.
81+
!!! error TS2345: Type 'IteratorResult<number, void>' is not assignable to type 'IteratorResult<never, unknown>'.
82+
!!! error TS2345: Type 'IteratorYieldResult<number>' is not assignable to type 'IteratorResult<never, unknown>'.
83+
!!! error TS2345: Type 'IteratorYieldResult<number>' is not assignable to type 'IteratorYieldResult<never>'.
84+
!!! error TS2345: Type 'number' is not assignable to type 'never'.
85+
yield* inner3(value);
86+
});
87+
88+
// error
89+
outer3(function* <T>(value: T) {
90+
~~~~~~~~
91+
!!! error TS2345: Argument of type '<T>(value: T) => Generator<number, void, any>' is not assignable to parameter of type '(value: unknown) => Generator<never, unknown, unknown>'.
92+
!!! error TS2345: Call signature return types 'Generator<number, void, any>' and 'Generator<never, unknown, unknown>' are incompatible.
93+
!!! error TS2345: The types returned by 'next(...)' are incompatible between these types.
94+
!!! error TS2345: Type 'IteratorResult<number, void>' is not assignable to type 'IteratorResult<never, unknown>'.
95+
!!! error TS2345: Type 'IteratorYieldResult<number>' is not assignable to type 'IteratorResult<never, unknown>'.
96+
!!! error TS2345: Type 'IteratorYieldResult<number>' is not assignable to type 'IteratorYieldResult<never>'.
97+
!!! error TS2345: Type 'number' is not assignable to type 'never'.
98+
const x = inner3(value);
99+
yield* x;
100+
});
34101

tests/baselines/reference/genericCallAtYieldExpressionInGenericCall1.symbols

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,3 +91,116 @@ outer(function* <T>(value: T) {
9191

9292
});
9393

94+
declare const inner3: {
95+
>inner3 : Symbol(inner3, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 28, 13))
96+
97+
<A>(value: A): {
98+
>A : Symbol(A, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 29, 3))
99+
>value : Symbol(value, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 29, 6))
100+
>A : Symbol(A, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 29, 3))
101+
102+
(): A;
103+
>A : Symbol(A, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 29, 3))
104+
105+
[Symbol.iterator](): {
106+
>[Symbol.iterator] : Symbol([Symbol.iterator], Decl(genericCallAtYieldExpressionInGenericCall1.ts, 30, 10))
107+
>Symbol.iterator : Symbol(SymbolConstructor.iterator, Decl(lib.es2015.iterable.d.ts, --, --))
108+
>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, --, --))
109+
>iterator : Symbol(SymbolConstructor.iterator, Decl(lib.es2015.iterable.d.ts, --, --))
110+
111+
next(...args: ReadonlyArray<any>): IteratorResult<number, A>;
112+
>next : Symbol(next, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 31, 26))
113+
>args : Symbol(args, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 32, 11))
114+
>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)
115+
>IteratorResult : Symbol(IteratorResult, Decl(lib.es2015.iterable.d.ts, --, --))
116+
>A : Symbol(A, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 29, 3))
117+
118+
};
119+
};
120+
};
121+
122+
declare function outer2<A, Y>(body: (value: A) => Generator<Y, any, any>): Y;
123+
>outer2 : Symbol(outer2, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 35, 2))
124+
>A : Symbol(A, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 37, 24))
125+
>Y : Symbol(Y, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 37, 26))
126+
>body : Symbol(body, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 37, 30))
127+
>value : Symbol(value, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 37, 37))
128+
>A : Symbol(A, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 37, 24))
129+
>Generator : Symbol(Generator, Decl(lib.es2015.generator.d.ts, --, --))
130+
>Y : Symbol(Y, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 37, 26))
131+
>Y : Symbol(Y, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 37, 26))
132+
133+
// number
134+
const result1 = outer2(function* <T>(value: T) {
135+
>result1 : Symbol(result1, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 40, 5))
136+
>outer2 : Symbol(outer2, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 35, 2))
137+
>T : Symbol(T, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 40, 34))
138+
>value : Symbol(value, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 40, 37))
139+
>T : Symbol(T, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 40, 34))
140+
141+
yield* inner3(value);
142+
>inner3 : Symbol(inner3, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 28, 13))
143+
>value : Symbol(value, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 40, 37))
144+
145+
});
146+
147+
// number
148+
const result2 = outer2(function* <T>(value: T) {
149+
>result2 : Symbol(result2, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 45, 5))
150+
>outer2 : Symbol(outer2, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 35, 2))
151+
>T : Symbol(T, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 45, 34))
152+
>value : Symbol(value, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 45, 37))
153+
>T : Symbol(T, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 45, 34))
154+
155+
const x = inner3(value);
156+
>x : Symbol(x, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 46, 7))
157+
>inner3 : Symbol(inner3, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 28, 13))
158+
>value : Symbol(value, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 45, 37))
159+
160+
yield* x;
161+
>x : Symbol(x, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 46, 7))
162+
163+
});
164+
165+
declare function outer3<A>(
166+
>outer3 : Symbol(outer3, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 48, 3))
167+
>A : Symbol(A, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 50, 24))
168+
169+
body: (value: A) => Generator<never, unknown, unknown>,
170+
>body : Symbol(body, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 50, 27))
171+
>value : Symbol(value, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 51, 9))
172+
>A : Symbol(A, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 50, 24))
173+
>Generator : Symbol(Generator, Decl(lib.es2015.generator.d.ts, --, --))
174+
175+
): void;
176+
177+
// error
178+
outer3(function* <T>(value: T) {
179+
>outer3 : Symbol(outer3, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 48, 3))
180+
>T : Symbol(T, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 55, 18))
181+
>value : Symbol(value, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 55, 21))
182+
>T : Symbol(T, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 55, 18))
183+
184+
yield* inner3(value);
185+
>inner3 : Symbol(inner3, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 28, 13))
186+
>value : Symbol(value, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 55, 21))
187+
188+
});
189+
190+
// error
191+
outer3(function* <T>(value: T) {
192+
>outer3 : Symbol(outer3, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 48, 3))
193+
>T : Symbol(T, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 60, 18))
194+
>value : Symbol(value, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 60, 21))
195+
>T : Symbol(T, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 60, 18))
196+
197+
const x = inner3(value);
198+
>x : Symbol(x, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 61, 7))
199+
>inner3 : Symbol(inner3, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 28, 13))
200+
>value : Symbol(value, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 60, 21))
201+
202+
yield* x;
203+
>x : Symbol(x, Decl(genericCallAtYieldExpressionInGenericCall1.ts, 61, 7))
204+
205+
});
206+

0 commit comments

Comments
 (0)