Skip to content

Commit 05d2076

Browse files
authored
Don't leak EvolvingArray out of code flow (#49943)
1 parent 3863cc4 commit 05d2076

File tree

6 files changed

+81
-1
lines changed

6 files changed

+81
-1
lines changed

src/compiler/checker.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11896,13 +11896,19 @@ namespace ts {
1189611896
else if ((type as MappedType).objectFlags & ObjectFlags.Mapped) {
1189711897
resolveMappedTypeMembers(type as MappedType);
1189811898
}
11899+
else {
11900+
Debug.fail("Unhandled object type " + Debug.formatObjectFlags(type.objectFlags));
11901+
}
1189911902
}
1190011903
else if (type.flags & TypeFlags.Union) {
1190111904
resolveUnionTypeMembers(type as UnionType);
1190211905
}
1190311906
else if (type.flags & TypeFlags.Intersection) {
1190411907
resolveIntersectionTypeMembers(type as IntersectionType);
1190511908
}
11909+
else {
11910+
Debug.fail("Unhandled type " + Debug.formatTypeFlags(type.flags));
11911+
}
1190611912
}
1190711913
return type as ResolvedType;
1190811914
}
@@ -24613,7 +24619,7 @@ namespace ts {
2461324619
}
2461424620
// for (const _ in ref) acts as a nonnull on ref
2461524621
if (isVariableDeclaration(node) && node.parent.parent.kind === SyntaxKind.ForInStatement && isMatchingReference(reference, node.parent.parent.expression)) {
24616-
return getNonNullableTypeIfNeeded(getTypeFromFlowType(getTypeAtFlowNode(flow.antecedent)));
24622+
return getNonNullableTypeIfNeeded(finalizeEvolvingArrayType(getTypeFromFlowType(getTypeAtFlowNode(flow.antecedent))));
2461724623
}
2461824624
// Assignment doesn't affect reference
2461924625
return undefined;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
tests/cases/compiler/evolvingArrayResolvedAssert.ts(1,5): error TS7034: Variable 'C' implicitly has type 'any[]' in some locations where its type cannot be determined.
2+
tests/cases/compiler/evolvingArrayResolvedAssert.ts(2,15): error TS7005: Variable 'C' implicitly has an 'any[]' type.
3+
tests/cases/compiler/evolvingArrayResolvedAssert.ts(3,9): error TS7005: Variable 'C' implicitly has an 'any[]' type.
4+
5+
6+
==== tests/cases/compiler/evolvingArrayResolvedAssert.ts (3 errors) ====
7+
var C = [];
8+
~
9+
!!! error TS7034: Variable 'C' implicitly has type 'any[]' in some locations where its type cannot be determined.
10+
for (var a in C) {
11+
~
12+
!!! error TS7005: Variable 'C' implicitly has an 'any[]' type.
13+
if (C.hasOwnProperty(a)) {
14+
~
15+
!!! error TS7005: Variable 'C' implicitly has an 'any[]' type.
16+
}
17+
}
18+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//// [evolvingArrayResolvedAssert.ts]
2+
var C = [];
3+
for (var a in C) {
4+
if (C.hasOwnProperty(a)) {
5+
}
6+
}
7+
8+
9+
//// [evolvingArrayResolvedAssert.js]
10+
"use strict";
11+
var C = [];
12+
for (var a in C) {
13+
if (C.hasOwnProperty(a)) {
14+
}
15+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
=== tests/cases/compiler/evolvingArrayResolvedAssert.ts ===
2+
var C = [];
3+
>C : Symbol(C, Decl(evolvingArrayResolvedAssert.ts, 0, 3))
4+
5+
for (var a in C) {
6+
>a : Symbol(a, Decl(evolvingArrayResolvedAssert.ts, 1, 8))
7+
>C : Symbol(C, Decl(evolvingArrayResolvedAssert.ts, 0, 3))
8+
9+
if (C.hasOwnProperty(a)) {
10+
>C.hasOwnProperty : Symbol(Object.hasOwnProperty, Decl(lib.es5.d.ts, --, --))
11+
>C : Symbol(C, Decl(evolvingArrayResolvedAssert.ts, 0, 3))
12+
>hasOwnProperty : Symbol(Object.hasOwnProperty, Decl(lib.es5.d.ts, --, --))
13+
>a : Symbol(a, Decl(evolvingArrayResolvedAssert.ts, 1, 8))
14+
}
15+
}
16+
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
=== tests/cases/compiler/evolvingArrayResolvedAssert.ts ===
2+
var C = [];
3+
>C : any[]
4+
>[] : never[]
5+
6+
for (var a in C) {
7+
>a : string
8+
>C : any[]
9+
10+
if (C.hasOwnProperty(a)) {
11+
>C.hasOwnProperty(a) : boolean
12+
>C.hasOwnProperty : (v: PropertyKey) => boolean
13+
>C : any[]
14+
>hasOwnProperty : (v: PropertyKey) => boolean
15+
>a : string
16+
}
17+
}
18+
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// @strict: true
2+
3+
var C = [];
4+
for (var a in C) {
5+
if (C.hasOwnProperty(a)) {
6+
}
7+
}

0 commit comments

Comments
 (0)