233 lines
9.3 KiB
Plaintext
233 lines
9.3 KiB
Plaintext
=== tests/cases/compiler/controlFlowInstanceof.ts ===
|
|
|
|
// Repros from #10167
|
|
|
|
function f1(s: Set<string> | Set<number>) {
|
|
>f1 : Symbol(f1, Decl(controlFlowInstanceof.ts, 0, 0))
|
|
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 3, 12))
|
|
>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, --, --))
|
|
>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, --, --))
|
|
|
|
s = new Set<number>();
|
|
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 3, 12))
|
|
>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, --, --))
|
|
|
|
s; // Set<number>
|
|
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 3, 12))
|
|
|
|
if (s instanceof Set) {
|
|
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 3, 12))
|
|
>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, --, --))
|
|
|
|
s; // Set<number>
|
|
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 3, 12))
|
|
}
|
|
s; // Set<number>
|
|
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 3, 12))
|
|
|
|
s.add(42);
|
|
>s.add : Symbol(Set.add, Decl(lib.es2015.collection.d.ts, --, --))
|
|
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 3, 12))
|
|
>add : Symbol(Set.add, Decl(lib.es2015.collection.d.ts, --, --))
|
|
}
|
|
|
|
function f2(s: Set<string> | Set<number>) {
|
|
>f2 : Symbol(f2, Decl(controlFlowInstanceof.ts, 11, 1))
|
|
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 13, 12))
|
|
>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, --, --))
|
|
>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, --, --))
|
|
|
|
s = new Set<number>();
|
|
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 13, 12))
|
|
>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, --, --))
|
|
|
|
s; // Set<number>
|
|
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 13, 12))
|
|
|
|
if (s instanceof Promise) {
|
|
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 13, 12))
|
|
>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
|
|
|
|
s; // Set<number> & Promise<any>
|
|
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 13, 12))
|
|
}
|
|
s; // Set<number>
|
|
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 13, 12))
|
|
|
|
s.add(42);
|
|
>s.add : Symbol(Set.add, Decl(lib.es2015.collection.d.ts, --, --))
|
|
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 13, 12))
|
|
>add : Symbol(Set.add, Decl(lib.es2015.collection.d.ts, --, --))
|
|
}
|
|
|
|
function f3(s: Set<string> | Set<number>) {
|
|
>f3 : Symbol(f3, Decl(controlFlowInstanceof.ts, 21, 1))
|
|
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 23, 12))
|
|
>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, --, --))
|
|
>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, --, --))
|
|
|
|
s; // Set<string> | Set<number>
|
|
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 23, 12))
|
|
|
|
if (s instanceof Set) {
|
|
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 23, 12))
|
|
>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, --, --))
|
|
|
|
s; // Set<string> | Set<number>
|
|
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 23, 12))
|
|
}
|
|
else {
|
|
s; // never
|
|
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 23, 12))
|
|
}
|
|
}
|
|
|
|
function f4(s: Set<string> | Set<number>) {
|
|
>f4 : Symbol(f4, Decl(controlFlowInstanceof.ts, 31, 1))
|
|
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 33, 12))
|
|
>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, --, --))
|
|
>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, --, --))
|
|
|
|
s = new Set<number>();
|
|
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 33, 12))
|
|
>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, --, --))
|
|
|
|
s; // Set<number>
|
|
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 33, 12))
|
|
|
|
if (s instanceof Set) {
|
|
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 33, 12))
|
|
>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, --, --))
|
|
|
|
s; // Set<number>
|
|
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 33, 12))
|
|
}
|
|
else {
|
|
s; // never
|
|
>s : Symbol(s, Decl(controlFlowInstanceof.ts, 33, 12))
|
|
}
|
|
}
|
|
|
|
// More tests
|
|
|
|
class A { a: string }
|
|
>A : Symbol(A, Decl(controlFlowInstanceof.ts, 42, 1))
|
|
>a : Symbol(A.a, Decl(controlFlowInstanceof.ts, 46, 9))
|
|
|
|
class B extends A { b: string }
|
|
>B : Symbol(B, Decl(controlFlowInstanceof.ts, 46, 21))
|
|
>A : Symbol(A, Decl(controlFlowInstanceof.ts, 42, 1))
|
|
>b : Symbol(B.b, Decl(controlFlowInstanceof.ts, 47, 19))
|
|
|
|
class C extends A { c: string }
|
|
>C : Symbol(C, Decl(controlFlowInstanceof.ts, 47, 31))
|
|
>A : Symbol(A, Decl(controlFlowInstanceof.ts, 42, 1))
|
|
>c : Symbol(C.c, Decl(controlFlowInstanceof.ts, 48, 19))
|
|
|
|
function foo(x: A | undefined) {
|
|
>foo : Symbol(foo, Decl(controlFlowInstanceof.ts, 48, 31))
|
|
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
|
|
>A : Symbol(A, Decl(controlFlowInstanceof.ts, 42, 1))
|
|
|
|
x; // A | undefined
|
|
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
|
|
|
|
if (x instanceof B || x instanceof C) {
|
|
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
|
|
>B : Symbol(B, Decl(controlFlowInstanceof.ts, 46, 21))
|
|
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
|
|
>C : Symbol(C, Decl(controlFlowInstanceof.ts, 47, 31))
|
|
|
|
x; // B | C
|
|
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
|
|
}
|
|
x; // A | undefined
|
|
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
|
|
|
|
if (x instanceof B && x instanceof C) {
|
|
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
|
|
>B : Symbol(B, Decl(controlFlowInstanceof.ts, 46, 21))
|
|
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
|
|
>C : Symbol(C, Decl(controlFlowInstanceof.ts, 47, 31))
|
|
|
|
x; // B & C
|
|
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
|
|
}
|
|
x; // A | undefined
|
|
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
|
|
|
|
if (!x) {
|
|
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
|
|
|
|
return;
|
|
}
|
|
x; // A
|
|
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
|
|
|
|
if (x instanceof B) {
|
|
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
|
|
>B : Symbol(B, Decl(controlFlowInstanceof.ts, 46, 21))
|
|
|
|
x; // B
|
|
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
|
|
|
|
if (x instanceof C) {
|
|
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
|
|
>C : Symbol(C, Decl(controlFlowInstanceof.ts, 47, 31))
|
|
|
|
x; // B & C
|
|
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
|
|
}
|
|
else {
|
|
x; // B
|
|
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
|
|
}
|
|
x; // B
|
|
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
|
|
}
|
|
else {
|
|
x; // A
|
|
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
|
|
}
|
|
x; // A
|
|
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 50, 13))
|
|
}
|
|
|
|
// X is neither assignable to Y nor a subtype of Y
|
|
// Y is assignable to X, but not a subtype of X
|
|
|
|
interface X {
|
|
>X : Symbol(X, Decl(controlFlowInstanceof.ts, 78, 1))
|
|
|
|
x?: string;
|
|
>x : Symbol(X.x, Decl(controlFlowInstanceof.ts, 83, 13))
|
|
}
|
|
|
|
class Y {
|
|
>Y : Symbol(Y, Decl(controlFlowInstanceof.ts, 85, 1))
|
|
|
|
y: string;
|
|
>y : Symbol(Y.y, Decl(controlFlowInstanceof.ts, 87, 9))
|
|
}
|
|
|
|
function goo(x: X) {
|
|
>goo : Symbol(goo, Decl(controlFlowInstanceof.ts, 89, 1))
|
|
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 91, 13))
|
|
>X : Symbol(X, Decl(controlFlowInstanceof.ts, 78, 1))
|
|
|
|
x;
|
|
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 91, 13))
|
|
|
|
if (x instanceof Y) {
|
|
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 91, 13))
|
|
>Y : Symbol(Y, Decl(controlFlowInstanceof.ts, 85, 1))
|
|
|
|
x.y;
|
|
>x.y : Symbol(Y.y, Decl(controlFlowInstanceof.ts, 87, 9))
|
|
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 91, 13))
|
|
>y : Symbol(Y.y, Decl(controlFlowInstanceof.ts, 87, 9))
|
|
}
|
|
x;
|
|
>x : Symbol(x, Decl(controlFlowInstanceof.ts, 91, 13))
|
|
}
|