From e7b6601de7ecd4afc000f1219c050ae662408ed6 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Wed, 17 Feb 2021 10:53:14 -1000 Subject: [PATCH] Add regression test --- .../reference/voidUndefinedReduction.js | 23 ++++++++++++ .../reference/voidUndefinedReduction.symbols | 33 +++++++++++++++++ .../reference/voidUndefinedReduction.types | 37 +++++++++++++++++++ .../cases/compiler/voidUndefinedReduction.ts | 13 +++++++ 4 files changed, 106 insertions(+) create mode 100644 tests/baselines/reference/voidUndefinedReduction.js create mode 100644 tests/baselines/reference/voidUndefinedReduction.symbols create mode 100644 tests/baselines/reference/voidUndefinedReduction.types create mode 100644 tests/cases/compiler/voidUndefinedReduction.ts diff --git a/tests/baselines/reference/voidUndefinedReduction.js b/tests/baselines/reference/voidUndefinedReduction.js new file mode 100644 index 00000000000..f0775310512 --- /dev/null +++ b/tests/baselines/reference/voidUndefinedReduction.js @@ -0,0 +1,23 @@ +//// [voidUndefinedReduction.ts] +// Repro from #42786 + +function isDefined(value: T | undefined | null | void): value is T { + return value !== undefined && value !== null; +} + +declare const foo: string | undefined; + +if (isDefined(foo)) { + console.log(foo.toUpperCase()); +} + + +//// [voidUndefinedReduction.js] +"use strict"; +// Repro from #42786 +function isDefined(value) { + return value !== undefined && value !== null; +} +if (isDefined(foo)) { + console.log(foo.toUpperCase()); +} diff --git a/tests/baselines/reference/voidUndefinedReduction.symbols b/tests/baselines/reference/voidUndefinedReduction.symbols new file mode 100644 index 00000000000..92430f84250 --- /dev/null +++ b/tests/baselines/reference/voidUndefinedReduction.symbols @@ -0,0 +1,33 @@ +=== tests/cases/compiler/voidUndefinedReduction.ts === +// Repro from #42786 + +function isDefined(value: T | undefined | null | void): value is T { +>isDefined : Symbol(isDefined, Decl(voidUndefinedReduction.ts, 0, 0)) +>T : Symbol(T, Decl(voidUndefinedReduction.ts, 2, 19)) +>value : Symbol(value, Decl(voidUndefinedReduction.ts, 2, 22)) +>T : Symbol(T, Decl(voidUndefinedReduction.ts, 2, 19)) +>value : Symbol(value, Decl(voidUndefinedReduction.ts, 2, 22)) +>T : Symbol(T, Decl(voidUndefinedReduction.ts, 2, 19)) + + return value !== undefined && value !== null; +>value : Symbol(value, Decl(voidUndefinedReduction.ts, 2, 22)) +>undefined : Symbol(undefined) +>value : Symbol(value, Decl(voidUndefinedReduction.ts, 2, 22)) +} + +declare const foo: string | undefined; +>foo : Symbol(foo, Decl(voidUndefinedReduction.ts, 6, 13)) + +if (isDefined(foo)) { +>isDefined : Symbol(isDefined, Decl(voidUndefinedReduction.ts, 0, 0)) +>foo : Symbol(foo, Decl(voidUndefinedReduction.ts, 6, 13)) + + console.log(foo.toUpperCase()); +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>foo.toUpperCase : Symbol(String.toUpperCase, Decl(lib.es5.d.ts, --, --)) +>foo : Symbol(foo, Decl(voidUndefinedReduction.ts, 6, 13)) +>toUpperCase : Symbol(String.toUpperCase, Decl(lib.es5.d.ts, --, --)) +} + diff --git a/tests/baselines/reference/voidUndefinedReduction.types b/tests/baselines/reference/voidUndefinedReduction.types new file mode 100644 index 00000000000..a11667bf476 --- /dev/null +++ b/tests/baselines/reference/voidUndefinedReduction.types @@ -0,0 +1,37 @@ +=== tests/cases/compiler/voidUndefinedReduction.ts === +// Repro from #42786 + +function isDefined(value: T | undefined | null | void): value is T { +>isDefined : (value: T | undefined | null | void) => value is T +>value : void | T | null | undefined +>null : null + + return value !== undefined && value !== null; +>value !== undefined && value !== null : boolean +>value !== undefined : boolean +>value : void | T | null | undefined +>undefined : undefined +>value !== null : boolean +>value : T | null +>null : null +} + +declare const foo: string | undefined; +>foo : string | undefined + +if (isDefined(foo)) { +>isDefined(foo) : boolean +>isDefined : (value: void | T | null | undefined) => value is T +>foo : string | undefined + + console.log(foo.toUpperCase()); +>console.log(foo.toUpperCase()) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>foo.toUpperCase() : string +>foo.toUpperCase : () => string +>foo : string +>toUpperCase : () => string +} + diff --git a/tests/cases/compiler/voidUndefinedReduction.ts b/tests/cases/compiler/voidUndefinedReduction.ts new file mode 100644 index 00000000000..8973f307cfe --- /dev/null +++ b/tests/cases/compiler/voidUndefinedReduction.ts @@ -0,0 +1,13 @@ +// @strict: true + +// Repro from #42786 + +function isDefined(value: T | undefined | null | void): value is T { + return value !== undefined && value !== null; +} + +declare const foo: string | undefined; + +if (isDefined(foo)) { + console.log(foo.toUpperCase()); +}