diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index b8bdbacd73f42..47578f64bf35e 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -43816,11 +43816,13 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { return +(expr as NumericLiteral).text; case SyntaxKind.ParenthesizedExpression: return evaluate((expr as ParenthesizedExpression).expression, location); - case SyntaxKind.Identifier: - if (isInfinityOrNaNString((expr as Identifier).escapedText)) { - return +((expr as Identifier).escapedText); + case SyntaxKind.Identifier: { + const identifier = expr as Identifier; + if (isInfinityOrNaNString(identifier.escapedText) && (resolveEntityName(identifier, SymbolFlags.Value, /*ignoreErrors*/ true) === getGlobalSymbol(identifier.escapedText, SymbolFlags.Value, /*diagnostic*/ undefined))) { + return +(identifier.escapedText); } // falls through + } case SyntaxKind.PropertyAccessExpression: if (isEntityNameExpression(expr)) { const symbol = resolveEntityName(expr, SymbolFlags.Value, /*ignoreErrors*/ true); diff --git a/tests/baselines/reference/enumShadowedInfinityNaN.errors.txt b/tests/baselines/reference/enumShadowedInfinityNaN.errors.txt new file mode 100644 index 0000000000000..83cce09ed39ca --- /dev/null +++ b/tests/baselines/reference/enumShadowedInfinityNaN.errors.txt @@ -0,0 +1,25 @@ +enumShadowedInfinityNaN.ts(6,9): error TS18033: Type '{}' is not assignable to type 'number' as required for computed enum member values. +enumShadowedInfinityNaN.ts(13,9): error TS18033: Type '{}' is not assignable to type 'number' as required for computed enum member values. + + +==== enumShadowedInfinityNaN.ts (2 errors) ==== + // https://github.com/microsoft/TypeScript/issues/54981 + + { + let Infinity = {}; + enum En { + X = Infinity + ~~~~~~~~ +!!! error TS18033: Type '{}' is not assignable to type 'number' as required for computed enum member values. + } + } + + { + let NaN = {}; + enum En { + X = NaN + ~~~ +!!! error TS18033: Type '{}' is not assignable to type 'number' as required for computed enum member values. + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/enumShadowedInfinityNaN.js b/tests/baselines/reference/enumShadowedInfinityNaN.js new file mode 100644 index 0000000000000..f34162951efb1 --- /dev/null +++ b/tests/baselines/reference/enumShadowedInfinityNaN.js @@ -0,0 +1,36 @@ +//// [tests/cases/conformance/enums/enumShadowedInfinityNaN.ts] //// + +//// [enumShadowedInfinityNaN.ts] +// https://github.com/microsoft/TypeScript/issues/54981 + +{ + let Infinity = {}; + enum En { + X = Infinity + } +} + +{ + let NaN = {}; + enum En { + X = NaN + } +} + + +//// [enumShadowedInfinityNaN.js] +// https://github.com/microsoft/TypeScript/issues/54981 +{ + var Infinity_1 = {}; + var En = void 0; + (function (En) { + En[En["X"] = Infinity_1] = "X"; + })(En || (En = {})); +} +{ + var NaN_1 = {}; + var En = void 0; + (function (En) { + En[En["X"] = NaN_1] = "X"; + })(En || (En = {})); +} diff --git a/tests/baselines/reference/enumShadowedInfinityNaN.symbols b/tests/baselines/reference/enumShadowedInfinityNaN.symbols new file mode 100644 index 0000000000000..e3ea308e634fd --- /dev/null +++ b/tests/baselines/reference/enumShadowedInfinityNaN.symbols @@ -0,0 +1,31 @@ +//// [tests/cases/conformance/enums/enumShadowedInfinityNaN.ts] //// + +=== enumShadowedInfinityNaN.ts === +// https://github.com/microsoft/TypeScript/issues/54981 + +{ + let Infinity = {}; +>Infinity : Symbol(Infinity, Decl(enumShadowedInfinityNaN.ts, 3, 5)) + + enum En { +>En : Symbol(En, Decl(enumShadowedInfinityNaN.ts, 3, 20)) + + X = Infinity +>X : Symbol(En.X, Decl(enumShadowedInfinityNaN.ts, 4, 11)) +>Infinity : Symbol(Infinity, Decl(enumShadowedInfinityNaN.ts, 3, 5)) + } +} + +{ + let NaN = {}; +>NaN : Symbol(NaN, Decl(enumShadowedInfinityNaN.ts, 10, 5)) + + enum En { +>En : Symbol(En, Decl(enumShadowedInfinityNaN.ts, 10, 15)) + + X = NaN +>X : Symbol(En.X, Decl(enumShadowedInfinityNaN.ts, 11, 11)) +>NaN : Symbol(NaN, Decl(enumShadowedInfinityNaN.ts, 10, 5)) + } +} + diff --git a/tests/baselines/reference/enumShadowedInfinityNaN.types b/tests/baselines/reference/enumShadowedInfinityNaN.types new file mode 100644 index 0000000000000..c1013f17043ab --- /dev/null +++ b/tests/baselines/reference/enumShadowedInfinityNaN.types @@ -0,0 +1,33 @@ +//// [tests/cases/conformance/enums/enumShadowedInfinityNaN.ts] //// + +=== enumShadowedInfinityNaN.ts === +// https://github.com/microsoft/TypeScript/issues/54981 + +{ + let Infinity = {}; +>Infinity : {} +>{} : {} + + enum En { +>En : En + + X = Infinity +>X : En.X +>Infinity : {} + } +} + +{ + let NaN = {}; +>NaN : {} +>{} : {} + + enum En { +>En : En + + X = NaN +>X : En.X +>NaN : {} + } +} + diff --git a/tests/cases/conformance/enums/enumShadowedInfinityNaN.ts b/tests/cases/conformance/enums/enumShadowedInfinityNaN.ts new file mode 100644 index 0000000000000..548fbd02d29d8 --- /dev/null +++ b/tests/cases/conformance/enums/enumShadowedInfinityNaN.ts @@ -0,0 +1,15 @@ +// https://github.com/microsoft/TypeScript/issues/54981 + +{ + let Infinity = {}; + enum En { + X = Infinity + } +} + +{ + let NaN = {}; + enum En { + X = NaN + } +}