Skip to content

Commit 67b3fe5

Browse files
committed
Add regression test
1 parent f50226b commit 67b3fe5

File tree

4 files changed

+647
-0
lines changed

4 files changed

+647
-0
lines changed
Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
//// [controlFlowInstanceof.ts]
2+
3+
// Repros from #10167
4+
5+
function f1(s: Set<string> | Set<number>) {
6+
s = new Set<number>();
7+
s; // Set<number>
8+
if (s instanceof Set) {
9+
s; // Set<number>
10+
}
11+
s; // Set<number>
12+
s.add(42);
13+
}
14+
15+
function f2(s: Set<string> | Set<number>) {
16+
s = new Set<number>();
17+
s; // Set<number>
18+
if (s instanceof Promise) {
19+
s; // Set<number> & Promise<any>
20+
}
21+
s; // Set<number>
22+
s.add(42);
23+
}
24+
25+
function f3(s: Set<string> | Set<number>) {
26+
s; // Set<string> | Set<number>
27+
if (s instanceof Set) {
28+
s; // Set<string> | Set<number>
29+
}
30+
else {
31+
s; // never
32+
}
33+
}
34+
35+
function f4(s: Set<string> | Set<number>) {
36+
s = new Set<number>();
37+
s; // Set<number>
38+
if (s instanceof Set) {
39+
s; // Set<number>
40+
}
41+
else {
42+
s; // never
43+
}
44+
}
45+
46+
// More tests
47+
48+
class A { a: string }
49+
class B extends A { b: string }
50+
class C extends A { c: string }
51+
52+
function foo(x: A | undefined) {
53+
x; // A | undefined
54+
if (x instanceof B || x instanceof C) {
55+
x; // B | C
56+
}
57+
x; // A | undefined
58+
if (x instanceof B && x instanceof C) {
59+
x; // B & C
60+
}
61+
x; // A | undefined
62+
if (!x) {
63+
return;
64+
}
65+
x; // A
66+
if (x instanceof B) {
67+
x; // B
68+
if (x instanceof C) {
69+
x; // B & C
70+
}
71+
else {
72+
x; // B
73+
}
74+
x; // B
75+
}
76+
else {
77+
x; // A
78+
}
79+
x; // A
80+
}
81+
82+
//// [controlFlowInstanceof.js]
83+
// Repros from #10167
84+
function f1(s) {
85+
s = new Set();
86+
s; // Set<number>
87+
if (s instanceof Set) {
88+
s; // Set<number>
89+
}
90+
s; // Set<number>
91+
s.add(42);
92+
}
93+
function f2(s) {
94+
s = new Set();
95+
s; // Set<number>
96+
if (s instanceof Promise) {
97+
s; // Set<number> & Promise<any>
98+
}
99+
s; // Set<number>
100+
s.add(42);
101+
}
102+
function f3(s) {
103+
s; // Set<string> | Set<number>
104+
if (s instanceof Set) {
105+
s; // Set<string> | Set<number>
106+
}
107+
else {
108+
s; // never
109+
}
110+
}
111+
function f4(s) {
112+
s = new Set();
113+
s; // Set<number>
114+
if (s instanceof Set) {
115+
s; // Set<number>
116+
}
117+
else {
118+
s; // never
119+
}
120+
}
121+
// More tests
122+
class A {
123+
}
124+
class B extends A {
125+
}
126+
class C extends A {
127+
}
128+
function foo(x) {
129+
x; // A | undefined
130+
if (x instanceof B || x instanceof C) {
131+
x; // B | C
132+
}
133+
x; // A | undefined
134+
if (x instanceof B && x instanceof C) {
135+
x; // B & C
136+
}
137+
x; // A | undefined
138+
if (!x) {
139+
return;
140+
}
141+
x; // A
142+
if (x instanceof B) {
143+
x; // B
144+
if (x instanceof C) {
145+
x; // B & C
146+
}
147+
else {
148+
x; // B
149+
}
150+
x; // B
151+
}
152+
else {
153+
x; // A
154+
}
155+
x; // A
156+
}
Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
=== tests/cases/compiler/controlFlowInstanceof.ts ===
2+
3+
// Repros from #10167
4+
5+
function f1(s: Set<string> | Set<number>) {
6+
>f1 : Symbol(f1, Decl(controlFlowInstanceof.ts, 0, 0))
7+
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 3, 12))
8+
>Set : Symbol(Set, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --))
9+
>Set : Symbol(Set, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --))
10+
11+
s = new Set<number>();
12+
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 3, 12))
13+
>Set : Symbol(Set, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --))
14+
15+
s; // Set<number>
16+
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 3, 12))
17+
18+
if (s instanceof Set) {
19+
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 3, 12))
20+
>Set : Symbol(Set, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --))
21+
22+
s; // Set<number>
23+
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 3, 12))
24+
}
25+
s; // Set<number>
26+
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 3, 12))
27+
28+
s.add(42);
29+
>s.add : Symbol(Set.add, Decl(lib.es2015.collection.d.ts, --, --))
30+
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 3, 12))
31+
>add : Symbol(Set.add, Decl(lib.es2015.collection.d.ts, --, --))
32+
}
33+
34+
function f2(s: Set<string> | Set<number>) {
35+
>f2 : Symbol(f2, Decl(controlFlowInstanceof.ts, 11, 1))
36+
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 13, 12))
37+
>Set : Symbol(Set, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --))
38+
>Set : Symbol(Set, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --))
39+
40+
s = new Set<number>();
41+
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 13, 12))
42+
>Set : Symbol(Set, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --))
43+
44+
s; // Set<number>
45+
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 13, 12))
46+
47+
if (s instanceof Promise) {
48+
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 13, 12))
49+
>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
50+
51+
s; // Set<number> & Promise<any>
52+
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 13, 12))
53+
}
54+
s; // Set<number>
55+
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 13, 12))
56+
57+
s.add(42);
58+
>s.add : Symbol(Set.add, Decl(lib.es2015.collection.d.ts, --, --))
59+
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 13, 12))
60+
>add : Symbol(Set.add, Decl(lib.es2015.collection.d.ts, --, --))
61+
}
62+
63+
function f3(s: Set<string> | Set<number>) {
64+
>f3 : Symbol(f3, Decl(controlFlowInstanceof.ts, 21, 1))
65+
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 23, 12))
66+
>Set : Symbol(Set, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --))
67+
>Set : Symbol(Set, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --))
68+
69+
s; // Set<string> | Set<number>
70+
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 23, 12))
71+
72+
if (s instanceof Set) {
73+
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 23, 12))
74+
>Set : Symbol(Set, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --))
75+
76+
s; // Set<string> | Set<number>
77+
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 23, 12))
78+
}
79+
else {
80+
s; // never
81+
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 23, 12))
82+
}
83+
}
84+
85+
function f4(s: Set<string> | Set<number>) {
86+
>f4 : Symbol(f4, Decl(controlFlowInstanceof.ts, 31, 1))
87+
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 33, 12))
88+
>Set : Symbol(Set, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --))
89+
>Set : Symbol(Set, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --))
90+
91+
s = new Set<number>();
92+
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 33, 12))
93+
>Set : Symbol(Set, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --))
94+
95+
s; // Set<number>
96+
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 33, 12))
97+
98+
if (s instanceof Set) {
99+
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 33, 12))
100+
>Set : Symbol(Set, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --))
101+
102+
s; // Set<number>
103+
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 33, 12))
104+
}
105+
else {
106+
s; // never
107+
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 33, 12))
108+
}
109+
}
110+
111+
// More tests
112+
113+
class A { a: string }
114+
>A : Symbol(A, Decl(controlFlowInstanceof.ts, 42, 1))
115+
>a : Symbol(A.a, Decl(controlFlowInstanceof.ts, 46, 9))
116+
117+
class B extends A { b: string }
118+
>B : Symbol(B, Decl(controlFlowInstanceof.ts, 46, 21))
119+
>A : Symbol(A, Decl(controlFlowInstanceof.ts, 42, 1))
120+
>b : Symbol(B.b, Decl(controlFlowInstanceof.ts, 47, 19))
121+
122+
class C extends A { c: string }
123+
>C : Symbol(C, Decl(controlFlowInstanceof.ts, 47, 31))
124+
>A : Symbol(A, Decl(controlFlowInstanceof.ts, 42, 1))
125+
>c : Symbol(C.c, Decl(controlFlowInstanceof.ts, 48, 19))
126+
127+
function foo(x: A | undefined) {
128+
>foo : Symbol(foo, Decl(controlFlowInstanceof.ts, 48, 31))
129+
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
130+
>A : Symbol(A, Decl(controlFlowInstanceof.ts, 42, 1))
131+
132+
x; // A | undefined
133+
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
134+
135+
if (x instanceof B || x instanceof C) {
136+
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
137+
>B : Symbol(B, Decl(controlFlowInstanceof.ts, 46, 21))
138+
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
139+
>C : Symbol(C, Decl(controlFlowInstanceof.ts, 47, 31))
140+
141+
x; // B | C
142+
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
143+
}
144+
x; // A | undefined
145+
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
146+
147+
if (x instanceof B && x instanceof C) {
148+
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
149+
>B : Symbol(B, Decl(controlFlowInstanceof.ts, 46, 21))
150+
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
151+
>C : Symbol(C, Decl(controlFlowInstanceof.ts, 47, 31))
152+
153+
x; // B & C
154+
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
155+
}
156+
x; // A | undefined
157+
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
158+
159+
if (!x) {
160+
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
161+
162+
return;
163+
}
164+
x; // A
165+
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
166+
167+
if (x instanceof B) {
168+
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
169+
>B : Symbol(B, Decl(controlFlowInstanceof.ts, 46, 21))
170+
171+
x; // B
172+
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
173+
174+
if (x instanceof C) {
175+
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
176+
>C : Symbol(C, Decl(controlFlowInstanceof.ts, 47, 31))
177+
178+
x; // B & C
179+
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
180+
}
181+
else {
182+
x; // B
183+
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
184+
}
185+
x; // B
186+
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
187+
}
188+
else {
189+
x; // A
190+
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
191+
}
192+
x; // A
193+
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
194+
}

0 commit comments

Comments
 (0)