From 59e5bbc393d7b136fab0467f1e3e646df3eb68ea Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Fri, 1 Dec 2017 19:51:14 -0800 Subject: [PATCH] Make sure autoArrayType is unique, even if no lib is available (#20344) * Make sure autoArrayType is unique, even if no lib is available * fix typo --- src/compiler/checker.ts | 5 ++++ .../reference/noCrashOnNoLib.errors.txt | 25 +++++++++++++++++++ tests/baselines/reference/noCrashOnNoLib.js | 18 +++++++++++++ .../reference/noCrashOnNoLib.symbols | 13 ++++++++++ .../baselines/reference/noCrashOnNoLib.types | 21 ++++++++++++++++ tests/cases/compiler/noCrashOnNoLib.ts | 8 ++++++ 6 files changed, 90 insertions(+) create mode 100644 tests/baselines/reference/noCrashOnNoLib.errors.txt create mode 100644 tests/baselines/reference/noCrashOnNoLib.js create mode 100644 tests/baselines/reference/noCrashOnNoLib.symbols create mode 100644 tests/baselines/reference/noCrashOnNoLib.types create mode 100644 tests/cases/compiler/noCrashOnNoLib.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index c3def69c1e0..2ab67120e4b 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -25170,7 +25170,12 @@ namespace ts { globalBooleanType = getGlobalType("Boolean" as __String, /*arity*/ 0, /*reportErrors*/ true); globalRegExpType = getGlobalType("RegExp" as __String, /*arity*/ 0, /*reportErrors*/ true); anyArrayType = createArrayType(anyType); + autoArrayType = createArrayType(autoType); + if (autoArrayType === emptyObjectType) { + // autoArrayType is used as a marker, so even if global Array type is not defined, it needs to be a unique type + autoArrayType = createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, undefined, undefined); + } globalReadonlyArrayType = getGlobalTypeOrUndefined("ReadonlyArray" as __String, /*arity*/ 1); anyReadonlyArrayType = globalReadonlyArrayType ? createTypeFromGenericGlobalType(globalReadonlyArrayType, [anyType]) : anyArrayType; diff --git a/tests/baselines/reference/noCrashOnNoLib.errors.txt b/tests/baselines/reference/noCrashOnNoLib.errors.txt new file mode 100644 index 00000000000..50e51918522 --- /dev/null +++ b/tests/baselines/reference/noCrashOnNoLib.errors.txt @@ -0,0 +1,25 @@ +error TS2318: Cannot find global type 'Array'. +error TS2318: Cannot find global type 'Boolean'. +error TS2318: Cannot find global type 'Function'. +error TS2318: Cannot find global type 'IArguments'. +error TS2318: Cannot find global type 'Number'. +error TS2318: Cannot find global type 'Object'. +error TS2318: Cannot find global type 'RegExp'. +error TS2318: Cannot find global type 'String'. + + +!!! error TS2318: Cannot find global type 'Array'. +!!! error TS2318: Cannot find global type 'Boolean'. +!!! error TS2318: Cannot find global type 'Function'. +!!! error TS2318: Cannot find global type 'IArguments'. +!!! error TS2318: Cannot find global type 'Number'. +!!! error TS2318: Cannot find global type 'Object'. +!!! error TS2318: Cannot find global type 'RegExp'. +!!! error TS2318: Cannot find global type 'String'. +==== tests/cases/compiler/noCrashOnNoLib.ts (0 errors) ==== + export function f() { + let e: {}[]; + while (true) { + e = [...(e || [])]; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/noCrashOnNoLib.js b/tests/baselines/reference/noCrashOnNoLib.js new file mode 100644 index 00000000000..715050103fb --- /dev/null +++ b/tests/baselines/reference/noCrashOnNoLib.js @@ -0,0 +1,18 @@ +//// [noCrashOnNoLib.ts] +export function f() { + let e: {}[]; + while (true) { + e = [...(e || [])]; + } +} + +//// [noCrashOnNoLib.js] +"use strict"; +exports.__esModule = true; +function f() { + var e; + while (true) { + e = (e || []).slice(); + } +} +exports.f = f; diff --git a/tests/baselines/reference/noCrashOnNoLib.symbols b/tests/baselines/reference/noCrashOnNoLib.symbols new file mode 100644 index 00000000000..ee36c90dc0f --- /dev/null +++ b/tests/baselines/reference/noCrashOnNoLib.symbols @@ -0,0 +1,13 @@ +=== tests/cases/compiler/noCrashOnNoLib.ts === +export function f() { +>f : Symbol(f, Decl(noCrashOnNoLib.ts, 0, 0)) + + let e: {}[]; +>e : Symbol(e, Decl(noCrashOnNoLib.ts, 1, 7)) + + while (true) { + e = [...(e || [])]; +>e : Symbol(e, Decl(noCrashOnNoLib.ts, 1, 7)) +>e : Symbol(e, Decl(noCrashOnNoLib.ts, 1, 7)) + } +} diff --git a/tests/baselines/reference/noCrashOnNoLib.types b/tests/baselines/reference/noCrashOnNoLib.types new file mode 100644 index 00000000000..384f34dc359 --- /dev/null +++ b/tests/baselines/reference/noCrashOnNoLib.types @@ -0,0 +1,21 @@ +=== tests/cases/compiler/noCrashOnNoLib.ts === +export function f() { +>f : () => void + + let e: {}[]; +>e : {} + + while (true) { +>true : true + + e = [...(e || [])]; +>e = [...(e || [])] : {} +>e : {} +>[...(e || [])] : {} +>...(e || []) : any +>(e || []) : {} +>e || [] : {} +>e : {} +>[] : {} + } +} diff --git a/tests/cases/compiler/noCrashOnNoLib.ts b/tests/cases/compiler/noCrashOnNoLib.ts new file mode 100644 index 00000000000..c4cb3f19359 --- /dev/null +++ b/tests/cases/compiler/noCrashOnNoLib.ts @@ -0,0 +1,8 @@ +// @noLib: true + +export function f() { + let e: {}[]; + while (true) { + e = [...(e || [])]; + } +} \ No newline at end of file