Skip to content

Commit 1481750

Browse files
authored
Correctly error on enum member values referring to identifiers shadowing Infinity and NaN (#55018)
1 parent 30fe6ad commit 1481750

File tree

6 files changed

+145
-3
lines changed

6 files changed

+145
-3
lines changed

src/compiler/checker.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43854,11 +43854,13 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4385443854
return +(expr as NumericLiteral).text;
4385543855
case SyntaxKind.ParenthesizedExpression:
4385643856
return evaluate((expr as ParenthesizedExpression).expression, location);
43857-
case SyntaxKind.Identifier:
43858-
if (isInfinityOrNaNString((expr as Identifier).escapedText)) {
43859-
return +((expr as Identifier).escapedText);
43857+
case SyntaxKind.Identifier: {
43858+
const identifier = expr as Identifier;
43859+
if (isInfinityOrNaNString(identifier.escapedText) && (resolveEntityName(identifier, SymbolFlags.Value, /*ignoreErrors*/ true) === getGlobalSymbol(identifier.escapedText, SymbolFlags.Value, /*diagnostic*/ undefined))) {
43860+
return +(identifier.escapedText);
4386043861
}
4386143862
// falls through
43863+
}
4386243864
case SyntaxKind.PropertyAccessExpression:
4386343865
if (isEntityNameExpression(expr)) {
4386443866
const symbol = resolveEntityName(expr, SymbolFlags.Value, /*ignoreErrors*/ true);
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
enumShadowedInfinityNaN.ts(6,9): error TS18033: Type '{}' is not assignable to type 'number' as required for computed enum member values.
2+
enumShadowedInfinityNaN.ts(13,9): error TS18033: Type '{}' is not assignable to type 'number' as required for computed enum member values.
3+
4+
5+
==== enumShadowedInfinityNaN.ts (2 errors) ====
6+
// https://github.com/microsoft/TypeScript/issues/54981
7+
8+
{
9+
let Infinity = {};
10+
enum En {
11+
X = Infinity
12+
~~~~~~~~
13+
!!! error TS18033: Type '{}' is not assignable to type 'number' as required for computed enum member values.
14+
}
15+
}
16+
17+
{
18+
let NaN = {};
19+
enum En {
20+
X = NaN
21+
~~~
22+
!!! error TS18033: Type '{}' is not assignable to type 'number' as required for computed enum member values.
23+
}
24+
}
25+
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
//// [tests/cases/conformance/enums/enumShadowedInfinityNaN.ts] ////
2+
3+
//// [enumShadowedInfinityNaN.ts]
4+
// https://github.com/microsoft/TypeScript/issues/54981
5+
6+
{
7+
let Infinity = {};
8+
enum En {
9+
X = Infinity
10+
}
11+
}
12+
13+
{
14+
let NaN = {};
15+
enum En {
16+
X = NaN
17+
}
18+
}
19+
20+
21+
//// [enumShadowedInfinityNaN.js]
22+
// https://github.com/microsoft/TypeScript/issues/54981
23+
{
24+
var Infinity_1 = {};
25+
var En = void 0;
26+
(function (En) {
27+
En[En["X"] = Infinity_1] = "X";
28+
})(En || (En = {}));
29+
}
30+
{
31+
var NaN_1 = {};
32+
var En = void 0;
33+
(function (En) {
34+
En[En["X"] = NaN_1] = "X";
35+
})(En || (En = {}));
36+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
//// [tests/cases/conformance/enums/enumShadowedInfinityNaN.ts] ////
2+
3+
=== enumShadowedInfinityNaN.ts ===
4+
// https://github.com/microsoft/TypeScript/issues/54981
5+
6+
{
7+
let Infinity = {};
8+
>Infinity : Symbol(Infinity, Decl(enumShadowedInfinityNaN.ts, 3, 5))
9+
10+
enum En {
11+
>En : Symbol(En, Decl(enumShadowedInfinityNaN.ts, 3, 20))
12+
13+
X = Infinity
14+
>X : Symbol(En.X, Decl(enumShadowedInfinityNaN.ts, 4, 11))
15+
>Infinity : Symbol(Infinity, Decl(enumShadowedInfinityNaN.ts, 3, 5))
16+
}
17+
}
18+
19+
{
20+
let NaN = {};
21+
>NaN : Symbol(NaN, Decl(enumShadowedInfinityNaN.ts, 10, 5))
22+
23+
enum En {
24+
>En : Symbol(En, Decl(enumShadowedInfinityNaN.ts, 10, 15))
25+
26+
X = NaN
27+
>X : Symbol(En.X, Decl(enumShadowedInfinityNaN.ts, 11, 11))
28+
>NaN : Symbol(NaN, Decl(enumShadowedInfinityNaN.ts, 10, 5))
29+
}
30+
}
31+
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
//// [tests/cases/conformance/enums/enumShadowedInfinityNaN.ts] ////
2+
3+
=== enumShadowedInfinityNaN.ts ===
4+
// https://github.com/microsoft/TypeScript/issues/54981
5+
6+
{
7+
let Infinity = {};
8+
>Infinity : {}
9+
>{} : {}
10+
11+
enum En {
12+
>En : En
13+
14+
X = Infinity
15+
>X : En.X
16+
>Infinity : {}
17+
}
18+
}
19+
20+
{
21+
let NaN = {};
22+
>NaN : {}
23+
>{} : {}
24+
25+
enum En {
26+
>En : En
27+
28+
X = NaN
29+
>X : En.X
30+
>NaN : {}
31+
}
32+
}
33+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// https://github.com/microsoft/TypeScript/issues/54981
2+
3+
{
4+
let Infinity = {};
5+
enum En {
6+
X = Infinity
7+
}
8+
}
9+
10+
{
11+
let NaN = {};
12+
enum En {
13+
X = NaN
14+
}
15+
}

0 commit comments

Comments
 (0)