diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 2b3bc631ebc..b598be408c1 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -16630,21 +16630,9 @@ namespace ts { * but is a subtype of the Function interface, the call is an untyped function call. */ function isUntypedFunctionCall(funcType: Type, apparentFuncType: Type, numCallSignatures: number, numConstructSignatures: number) { - if (isTypeAny(funcType)) { - return true; - } - if (isTypeAny(apparentFuncType) && funcType.flags & TypeFlags.TypeParameter) { - return true; - } - if (!numCallSignatures && !numConstructSignatures) { - // We exclude union types because we may have a union of function types that happen to have - // no common signatures. - if (funcType.flags & TypeFlags.Union) { - return false; - } - return isTypeAssignableTo(funcType, globalFunctionType); - } - return false; + // We exclude union types because we may have a union of function types that happen to have no common signatures. + return isTypeAny(funcType) || isTypeAny(apparentFuncType) && funcType.flags & TypeFlags.TypeParameter || + !numCallSignatures && !numConstructSignatures && !(funcType.flags & (TypeFlags.Union | TypeFlags.Never)) && isTypeAssignableTo(funcType, globalFunctionType); } function resolveNewExpression(node: NewExpression, candidatesOutArray: Signature[]): Signature { diff --git a/tests/baselines/reference/neverTypeErrors1.errors.txt b/tests/baselines/reference/neverTypeErrors1.errors.txt index a27c6fba065..56233fb6101 100644 --- a/tests/baselines/reference/neverTypeErrors1.errors.txt +++ b/tests/baselines/reference/neverTypeErrors1.errors.txt @@ -4,12 +4,13 @@ tests/cases/conformance/types/never/neverTypeErrors1.ts(5,5): error TS2322: Type tests/cases/conformance/types/never/neverTypeErrors1.ts(6,5): error TS2322: Type 'undefined' is not assignable to type 'never'. tests/cases/conformance/types/never/neverTypeErrors1.ts(7,5): error TS2322: Type 'null' is not assignable to type 'never'. tests/cases/conformance/types/never/neverTypeErrors1.ts(8,5): error TS2322: Type '{}' is not assignable to type 'never'. -tests/cases/conformance/types/never/neverTypeErrors1.ts(12,5): error TS2322: Type 'undefined' is not assignable to type 'never'. -tests/cases/conformance/types/never/neverTypeErrors1.ts(16,5): error TS2322: Type '1' is not assignable to type 'never'. -tests/cases/conformance/types/never/neverTypeErrors1.ts(19,16): error TS2534: A function returning 'never' cannot have a reachable end point. +tests/cases/conformance/types/never/neverTypeErrors1.ts(9,5): error TS2349: Cannot invoke an expression whose type lacks a call signature. Type 'never' has no compatible call signatures. +tests/cases/conformance/types/never/neverTypeErrors1.ts(13,5): error TS2322: Type 'undefined' is not assignable to type 'never'. +tests/cases/conformance/types/never/neverTypeErrors1.ts(17,5): error TS2322: Type '1' is not assignable to type 'never'. +tests/cases/conformance/types/never/neverTypeErrors1.ts(20,16): error TS2534: A function returning 'never' cannot have a reachable end point. -==== tests/cases/conformance/types/never/neverTypeErrors1.ts (9 errors) ==== +==== tests/cases/conformance/types/never/neverTypeErrors1.ts (10 errors) ==== function f1() { let x: never; x = 1; @@ -30,6 +31,9 @@ tests/cases/conformance/types/never/neverTypeErrors1.ts(19,16): error TS2534: A x = {}; ~ !!! error TS2322: Type '{}' is not assignable to type 'never'. + x(); + ~~~ +!!! error TS2349: Cannot invoke an expression whose type lacks a call signature. Type 'never' has no compatible call signatures. } function f2(): never { diff --git a/tests/baselines/reference/neverTypeErrors1.js b/tests/baselines/reference/neverTypeErrors1.js index 81b3f8f9cdb..4bbe131cd05 100644 --- a/tests/baselines/reference/neverTypeErrors1.js +++ b/tests/baselines/reference/neverTypeErrors1.js @@ -7,6 +7,7 @@ function f1() { x = undefined; x = null; x = {}; + x(); } function f2(): never { @@ -29,6 +30,7 @@ function f1() { x = undefined; x = null; x = {}; + x(); } function f2() { return; diff --git a/tests/baselines/reference/neverTypeErrors1.symbols b/tests/baselines/reference/neverTypeErrors1.symbols index c9525226aab..eee8e493144 100644 --- a/tests/baselines/reference/neverTypeErrors1.symbols +++ b/tests/baselines/reference/neverTypeErrors1.symbols @@ -23,20 +23,23 @@ function f1() { x = {}; >x : Symbol(x, Decl(neverTypeErrors1.ts, 1, 7)) + + x(); +>x : Symbol(x, Decl(neverTypeErrors1.ts, 1, 7)) } function f2(): never { ->f2 : Symbol(f2, Decl(neverTypeErrors1.ts, 8, 1)) +>f2 : Symbol(f2, Decl(neverTypeErrors1.ts, 9, 1)) return; } function f3(): never { ->f3 : Symbol(f3, Decl(neverTypeErrors1.ts, 12, 1)) +>f3 : Symbol(f3, Decl(neverTypeErrors1.ts, 13, 1)) return 1; } function f4(): never { ->f4 : Symbol(f4, Decl(neverTypeErrors1.ts, 16, 1)) +>f4 : Symbol(f4, Decl(neverTypeErrors1.ts, 17, 1)) } diff --git a/tests/baselines/reference/neverTypeErrors1.types b/tests/baselines/reference/neverTypeErrors1.types index 150459b32b3..fe21a8c5ba2 100644 --- a/tests/baselines/reference/neverTypeErrors1.types +++ b/tests/baselines/reference/neverTypeErrors1.types @@ -34,6 +34,10 @@ function f1() { >x = {} : {} >x : never >{} : {} + + x(); +>x() : any +>x : never } function f2(): never { diff --git a/tests/baselines/reference/neverTypeErrors2.errors.txt b/tests/baselines/reference/neverTypeErrors2.errors.txt index 5f9bb26344f..eb24ac8251c 100644 --- a/tests/baselines/reference/neverTypeErrors2.errors.txt +++ b/tests/baselines/reference/neverTypeErrors2.errors.txt @@ -4,12 +4,13 @@ tests/cases/conformance/types/never/neverTypeErrors2.ts(5,5): error TS2322: Type tests/cases/conformance/types/never/neverTypeErrors2.ts(6,5): error TS2322: Type 'undefined' is not assignable to type 'never'. tests/cases/conformance/types/never/neverTypeErrors2.ts(7,5): error TS2322: Type 'null' is not assignable to type 'never'. tests/cases/conformance/types/never/neverTypeErrors2.ts(8,5): error TS2322: Type '{}' is not assignable to type 'never'. -tests/cases/conformance/types/never/neverTypeErrors2.ts(12,5): error TS2322: Type 'undefined' is not assignable to type 'never'. -tests/cases/conformance/types/never/neverTypeErrors2.ts(16,5): error TS2322: Type '1' is not assignable to type 'never'. -tests/cases/conformance/types/never/neverTypeErrors2.ts(19,16): error TS2534: A function returning 'never' cannot have a reachable end point. +tests/cases/conformance/types/never/neverTypeErrors2.ts(9,5): error TS2349: Cannot invoke an expression whose type lacks a call signature. Type 'never' has no compatible call signatures. +tests/cases/conformance/types/never/neverTypeErrors2.ts(13,5): error TS2322: Type 'undefined' is not assignable to type 'never'. +tests/cases/conformance/types/never/neverTypeErrors2.ts(17,5): error TS2322: Type '1' is not assignable to type 'never'. +tests/cases/conformance/types/never/neverTypeErrors2.ts(20,16): error TS2534: A function returning 'never' cannot have a reachable end point. -==== tests/cases/conformance/types/never/neverTypeErrors2.ts (9 errors) ==== +==== tests/cases/conformance/types/never/neverTypeErrors2.ts (10 errors) ==== function f1() { let x: never; x = 1; @@ -30,6 +31,9 @@ tests/cases/conformance/types/never/neverTypeErrors2.ts(19,16): error TS2534: A x = {}; ~ !!! error TS2322: Type '{}' is not assignable to type 'never'. + x(); + ~~~ +!!! error TS2349: Cannot invoke an expression whose type lacks a call signature. Type 'never' has no compatible call signatures. } function f2(): never { diff --git a/tests/baselines/reference/neverTypeErrors2.js b/tests/baselines/reference/neverTypeErrors2.js index 70bdb4673ca..940c4df5556 100644 --- a/tests/baselines/reference/neverTypeErrors2.js +++ b/tests/baselines/reference/neverTypeErrors2.js @@ -7,6 +7,7 @@ function f1() { x = undefined; x = null; x = {}; + x(); } function f2(): never { @@ -29,6 +30,7 @@ function f1() { x = undefined; x = null; x = {}; + x(); } function f2() { return; diff --git a/tests/baselines/reference/neverTypeErrors2.symbols b/tests/baselines/reference/neverTypeErrors2.symbols index 683751fe663..17433391576 100644 --- a/tests/baselines/reference/neverTypeErrors2.symbols +++ b/tests/baselines/reference/neverTypeErrors2.symbols @@ -23,20 +23,23 @@ function f1() { x = {}; >x : Symbol(x, Decl(neverTypeErrors2.ts, 1, 7)) + + x(); +>x : Symbol(x, Decl(neverTypeErrors2.ts, 1, 7)) } function f2(): never { ->f2 : Symbol(f2, Decl(neverTypeErrors2.ts, 8, 1)) +>f2 : Symbol(f2, Decl(neverTypeErrors2.ts, 9, 1)) return; } function f3(): never { ->f3 : Symbol(f3, Decl(neverTypeErrors2.ts, 12, 1)) +>f3 : Symbol(f3, Decl(neverTypeErrors2.ts, 13, 1)) return 1; } function f4(): never { ->f4 : Symbol(f4, Decl(neverTypeErrors2.ts, 16, 1)) +>f4 : Symbol(f4, Decl(neverTypeErrors2.ts, 17, 1)) } diff --git a/tests/baselines/reference/neverTypeErrors2.types b/tests/baselines/reference/neverTypeErrors2.types index 071f1779a43..9e45bf1aeba 100644 --- a/tests/baselines/reference/neverTypeErrors2.types +++ b/tests/baselines/reference/neverTypeErrors2.types @@ -34,6 +34,10 @@ function f1() { >x = {} : {} >x : never >{} : {} + + x(); +>x() : any +>x : never } function f2(): never { diff --git a/tests/cases/conformance/types/never/neverTypeErrors1.ts b/tests/cases/conformance/types/never/neverTypeErrors1.ts index 8d78e863098..deab74c6690 100644 --- a/tests/cases/conformance/types/never/neverTypeErrors1.ts +++ b/tests/cases/conformance/types/never/neverTypeErrors1.ts @@ -6,6 +6,7 @@ function f1() { x = undefined; x = null; x = {}; + x(); } function f2(): never { diff --git a/tests/cases/conformance/types/never/neverTypeErrors2.ts b/tests/cases/conformance/types/never/neverTypeErrors2.ts index 635d1c9c6ad..2c637580d00 100644 --- a/tests/cases/conformance/types/never/neverTypeErrors2.ts +++ b/tests/cases/conformance/types/never/neverTypeErrors2.ts @@ -8,6 +8,7 @@ function f1() { x = undefined; x = null; x = {}; + x(); } function f2(): never {