diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 30d9ad90213..721e8aab3c8 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -333,6 +333,7 @@ namespace ts { let totalInstantiationCount = 0; let instantiationCount = 0; let instantiationDepth = 0; + let inlineLevel = 0; let currentNode: Node | undefined; const emptySymbols = createSymbolTable(); @@ -23247,7 +23248,6 @@ namespace ts { let key: string | undefined; let isKeySet = false; let flowDepth = 0; - let inlineLevel = 0; if (flowAnalysisDisabled) { return errorType; } diff --git a/tests/baselines/reference/controlFlowAliasing.errors.txt b/tests/baselines/reference/controlFlowAliasing.errors.txt index a29ae9e2faf..04c2aacd712 100644 --- a/tests/baselines/reference/controlFlowAliasing.errors.txt +++ b/tests/baselines/reference/controlFlowAliasing.errors.txt @@ -32,9 +32,11 @@ tests/cases/conformance/controlFlow/controlFlowAliasing.ts(267,13): error TS2322 Type 'number' is not assignable to type 'string'. tests/cases/conformance/controlFlow/controlFlowAliasing.ts(270,13): error TS2322: Type 'string | number' is not assignable to type 'number'. Type 'string' is not assignable to type 'number'. +tests/cases/conformance/controlFlow/controlFlowAliasing.ts(280,5): error TS2448: Block-scoped variable 'a' used before its declaration. +tests/cases/conformance/controlFlow/controlFlowAliasing.ts(280,5): error TS2454: Variable 'a' is used before being assigned. -==== tests/cases/conformance/controlFlow/controlFlowAliasing.ts (17 errors) ==== +==== tests/cases/conformance/controlFlow/controlFlowAliasing.ts (19 errors) ==== // Narrowing by aliased conditional expressions function f10(x: string | number) { @@ -358,4 +360,19 @@ tests/cases/conformance/controlFlow/controlFlowAliasing.ts(270,13): error TS2322 !!! error TS2322: Type 'string' is not assignable to type 'number'. } } + + // Repro from #45830 + + const obj = { + fn: () => true + }; + + if (a) { } + ~ +!!! error TS2448: Block-scoped variable 'a' used before its declaration. +!!! related TS2728 tests/cases/conformance/controlFlow/controlFlowAliasing.ts:282:7: 'a' is declared here. + ~ +!!! error TS2454: Variable 'a' is used before being assigned. + + const a = obj.fn(); \ No newline at end of file diff --git a/tests/baselines/reference/controlFlowAliasing.js b/tests/baselines/reference/controlFlowAliasing.js index 4ed26e586c3..96d965a2d2b 100644 --- a/tests/baselines/reference/controlFlowAliasing.js +++ b/tests/baselines/reference/controlFlowAliasing.js @@ -271,6 +271,16 @@ function foo({ kind, payload }: Data) { let t: number = payload; } } + +// Repro from #45830 + +const obj = { + fn: () => true +}; + +if (a) { } + +const a = obj.fn(); //// [controlFlowAliasing.js] @@ -522,6 +532,12 @@ function foo(_a) { var t = payload; } } +// Repro from #45830 +var obj = { + fn: function () { return true; } +}; +if (a) { } +var a = obj.fn(); //// [controlFlowAliasing.d.ts] @@ -657,3 +673,7 @@ declare type Data = { }; declare function gg2(obj: Data): void; declare function foo({ kind, payload }: Data): void; +declare const obj: { + fn: () => boolean; +}; +declare const a: boolean; diff --git a/tests/baselines/reference/controlFlowAliasing.symbols b/tests/baselines/reference/controlFlowAliasing.symbols index 6fb00b34281..5fde002caff 100644 --- a/tests/baselines/reference/controlFlowAliasing.symbols +++ b/tests/baselines/reference/controlFlowAliasing.symbols @@ -772,3 +772,22 @@ function foo({ kind, payload }: Data) { } } +// Repro from #45830 + +const obj = { +>obj : Symbol(obj, Decl(controlFlowAliasing.ts, 275, 5)) + + fn: () => true +>fn : Symbol(fn, Decl(controlFlowAliasing.ts, 275, 13)) + +}; + +if (a) { } +>a : Symbol(a, Decl(controlFlowAliasing.ts, 281, 5)) + +const a = obj.fn(); +>a : Symbol(a, Decl(controlFlowAliasing.ts, 281, 5)) +>obj.fn : Symbol(fn, Decl(controlFlowAliasing.ts, 275, 13)) +>obj : Symbol(obj, Decl(controlFlowAliasing.ts, 275, 5)) +>fn : Symbol(fn, Decl(controlFlowAliasing.ts, 275, 13)) + diff --git a/tests/baselines/reference/controlFlowAliasing.types b/tests/baselines/reference/controlFlowAliasing.types index aced9845a07..bbca40eb168 100644 --- a/tests/baselines/reference/controlFlowAliasing.types +++ b/tests/baselines/reference/controlFlowAliasing.types @@ -897,3 +897,26 @@ function foo({ kind, payload }: Data) { } } +// Repro from #45830 + +const obj = { +>obj : { fn: () => boolean; } +>{ fn: () => true} : { fn: () => boolean; } + + fn: () => true +>fn : () => boolean +>() => true : () => boolean +>true : true + +}; + +if (a) { } +>a : boolean + +const a = obj.fn(); +>a : boolean +>obj.fn() : boolean +>obj.fn : () => boolean +>obj : { fn: () => boolean; } +>fn : () => boolean + diff --git a/tests/cases/conformance/controlFlow/controlFlowAliasing.ts b/tests/cases/conformance/controlFlow/controlFlowAliasing.ts index b8d2a81fb1a..03b7530921d 100644 --- a/tests/cases/conformance/controlFlow/controlFlowAliasing.ts +++ b/tests/cases/conformance/controlFlow/controlFlowAliasing.ts @@ -273,3 +273,13 @@ function foo({ kind, payload }: Data) { let t: number = payload; } } + +// Repro from #45830 + +const obj = { + fn: () => true +}; + +if (a) { } + +const a = obj.fn();