@@ -348,6 +348,7 @@ namespace ts {
348
348
let inlineLevel = 0;
349
349
let varianceLevel = 0;
350
350
let nestedVarianceSymbols: Symbol[] | undefined;
351
+ let incompleteVariancesObserved = false;
351
352
let currentNode: Node | undefined;
352
353
353
354
const emptySymbols = createSymbolTable();
@@ -20445,15 +20446,22 @@ namespace ts {
20445
20446
varianceLevel--;
20446
20447
// Recursive invocations of getVariancesWorker occur when two or more types circularly reference each
20447
20448
// other. In such cases, the nested invocations might observe in-process variance computations, i.e.
20448
- // cases where getVariancesWorker returns emptyArray, and thus might compute incomplete variances. For
20449
- // this reason we clear (and thus re-compute) the results of nested variance computations and only
20450
- // permanently record the outermost result. See #44572.
20451
- if (varianceLevel === 0 && nestedVarianceSymbols) {
20452
- for (const sym of nestedVarianceSymbols) getSymbolLinks(sym).variances = undefined;
20449
+ // cases where getVariancesWorker returns emptyArray. If that happens we clear (and thus re-compute) the
20450
+ // results of nested variance computations and only permanently record the outermost result. See #44572.
20451
+ if (varianceLevel === 0) {
20452
+ if (nestedVarianceSymbols && incompleteVariancesObserved) {
20453
+ for (const sym of nestedVarianceSymbols) {
20454
+ getSymbolLinks(sym).variances = undefined;
20455
+ }
20456
+ }
20453
20457
nestedVarianceSymbols = undefined;
20458
+ incompleteVariancesObserved = false;
20454
20459
}
20455
20460
tracing?.pop();
20456
20461
}
20462
+ else {
20463
+ incompleteVariancesObserved ||= links.variances === emptyArray;
20464
+ }
20457
20465
return links.variances;
20458
20466
}
20459
20467
0 commit comments