mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-02-05 08:11:30 -06:00
Correctly error on enum member values referring to identifiers shadowing Infinity and NaN (#55018)
This commit is contained in:
parent
30fe6ada02
commit
1481750043
@ -43854,11 +43854,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);
|
||||
|
||||
25
tests/baselines/reference/enumShadowedInfinityNaN.errors.txt
Normal file
25
tests/baselines/reference/enumShadowedInfinityNaN.errors.txt
Normal file
@ -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.
|
||||
}
|
||||
}
|
||||
|
||||
36
tests/baselines/reference/enumShadowedInfinityNaN.js
Normal file
36
tests/baselines/reference/enumShadowedInfinityNaN.js
Normal file
@ -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 = {}));
|
||||
}
|
||||
31
tests/baselines/reference/enumShadowedInfinityNaN.symbols
Normal file
31
tests/baselines/reference/enumShadowedInfinityNaN.symbols
Normal file
@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
33
tests/baselines/reference/enumShadowedInfinityNaN.types
Normal file
33
tests/baselines/reference/enumShadowedInfinityNaN.types
Normal file
@ -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 : {}
|
||||
}
|
||||
}
|
||||
|
||||
15
tests/cases/conformance/enums/enumShadowedInfinityNaN.ts
Normal file
15
tests/cases/conformance/enums/enumShadowedInfinityNaN.ts
Normal file
@ -0,0 +1,15 @@
|
||||
// https://github.com/microsoft/TypeScript/issues/54981
|
||||
|
||||
{
|
||||
let Infinity = {};
|
||||
enum En {
|
||||
X = Infinity
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
let NaN = {};
|
||||
enum En {
|
||||
X = NaN
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user