From 13b45ceba6b0c6d24e680b6a997e6683cd1839a3 Mon Sep 17 00:00:00 2001 From: magic-akari Date: Wed, 28 May 2025 06:40:27 +0800 Subject: [PATCH 1/3] fix(checker): report error when using bigint as enum key --- src/compiler/checker.ts | 4 ++++ .../baselines/reference/enumWithBugint.errors.txt | 10 ++++++++++ tests/baselines/reference/enumWithBugint.js | 13 +++++++++++++ tests/baselines/reference/enumWithBugint.symbols | 10 ++++++++++ tests/baselines/reference/enumWithBugint.types | 14 ++++++++++++++ tests/cases/compiler/enumWithBugint.ts | 3 +++ 6 files changed, 54 insertions(+) create mode 100644 tests/baselines/reference/enumWithBugint.errors.txt create mode 100644 tests/baselines/reference/enumWithBugint.js create mode 100644 tests/baselines/reference/enumWithBugint.symbols create mode 100644 tests/baselines/reference/enumWithBugint.types create mode 100644 tests/cases/compiler/enumWithBugint.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index a5c161abae051..e17144c9fd3f3 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -481,6 +481,7 @@ import { isAssignmentTarget, isAutoAccessorPropertyDeclaration, isAwaitExpression, + isBigIntLiteral, isBinaryExpression, isBinaryLogicalOperator, isBindableObjectDefinePropertyCall, @@ -47541,6 +47542,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { if (isComputedNonLiteralName(member.name)) { error(member.name, Diagnostics.Computed_property_names_are_not_allowed_in_enums); } + else if (isNumericLiteral(member.name) || isBigIntLiteral(member.name)) { + error(member.name, Diagnostics.An_enum_member_cannot_have_a_numeric_name); + } else { const text = getTextOfPropertyName(member.name); if (isNumericLiteralName(text) && !isInfinityOrNaNString(text)) { diff --git a/tests/baselines/reference/enumWithBugint.errors.txt b/tests/baselines/reference/enumWithBugint.errors.txt new file mode 100644 index 0000000000000..6d12a2a66fda2 --- /dev/null +++ b/tests/baselines/reference/enumWithBugint.errors.txt @@ -0,0 +1,10 @@ +enumWithBugint.ts(2,3): error TS2452: An enum member cannot have a numeric name. + + +==== enumWithBugint.ts (1 errors) ==== + enum E { + 0n = 0, + ~~ +!!! error TS2452: An enum member cannot have a numeric name. + } + \ No newline at end of file diff --git a/tests/baselines/reference/enumWithBugint.js b/tests/baselines/reference/enumWithBugint.js new file mode 100644 index 0000000000000..046d760182daf --- /dev/null +++ b/tests/baselines/reference/enumWithBugint.js @@ -0,0 +1,13 @@ +//// [tests/cases/compiler/enumWithBugint.ts] //// + +//// [enumWithBugint.ts] +enum E { + 0n = 0, +} + + +//// [enumWithBugint.js] +var E; +(function (E) { + E[E[0n] = 0] = 0n; +})(E || (E = {})); diff --git a/tests/baselines/reference/enumWithBugint.symbols b/tests/baselines/reference/enumWithBugint.symbols new file mode 100644 index 0000000000000..aaea0e622f301 --- /dev/null +++ b/tests/baselines/reference/enumWithBugint.symbols @@ -0,0 +1,10 @@ +//// [tests/cases/compiler/enumWithBugint.ts] //// + +=== enumWithBugint.ts === +enum E { +>E : Symbol(E, Decl(enumWithBugint.ts, 0, 0)) + + 0n = 0, +>0n : Symbol(E[0n], Decl(enumWithBugint.ts, 0, 8)) +} + diff --git a/tests/baselines/reference/enumWithBugint.types b/tests/baselines/reference/enumWithBugint.types new file mode 100644 index 0000000000000..69a0ef2dbd63b --- /dev/null +++ b/tests/baselines/reference/enumWithBugint.types @@ -0,0 +1,14 @@ +//// [tests/cases/compiler/enumWithBugint.ts] //// + +=== enumWithBugint.ts === +enum E { +>E : E +> : ^ + + 0n = 0, +>0n : E.__missing +> : ^^^^^^^^^^^ +>0 : 0 +> : ^ +} + diff --git a/tests/cases/compiler/enumWithBugint.ts b/tests/cases/compiler/enumWithBugint.ts new file mode 100644 index 0000000000000..0add71d1d8d5f --- /dev/null +++ b/tests/cases/compiler/enumWithBugint.ts @@ -0,0 +1,3 @@ +enum E { + 0n = 0, +} From b932ac379ef07d54e58937d352597fad71a62eaf Mon Sep 17 00:00:00 2001 From: magic-akari Date: Wed, 28 May 2025 07:20:05 +0800 Subject: [PATCH 2/3] chore: correct filename --- ...Bugint.errors.txt => enumWithBigint.errors.txt} | 4 ++-- tests/baselines/reference/enumWithBigint.js | 13 +++++++++++++ tests/baselines/reference/enumWithBigint.symbols | 10 ++++++++++ tests/baselines/reference/enumWithBigint.types | 14 ++++++++++++++ tests/baselines/reference/enumWithBugint.js | 13 ------------- tests/baselines/reference/enumWithBugint.symbols | 10 ---------- tests/baselines/reference/enumWithBugint.types | 14 -------------- .../{enumWithBugint.ts => enumWithBigint.ts} | 0 8 files changed, 39 insertions(+), 39 deletions(-) rename tests/baselines/reference/{enumWithBugint.errors.txt => enumWithBigint.errors.txt} (52%) create mode 100644 tests/baselines/reference/enumWithBigint.js create mode 100644 tests/baselines/reference/enumWithBigint.symbols create mode 100644 tests/baselines/reference/enumWithBigint.types delete mode 100644 tests/baselines/reference/enumWithBugint.js delete mode 100644 tests/baselines/reference/enumWithBugint.symbols delete mode 100644 tests/baselines/reference/enumWithBugint.types rename tests/cases/compiler/{enumWithBugint.ts => enumWithBigint.ts} (100%) diff --git a/tests/baselines/reference/enumWithBugint.errors.txt b/tests/baselines/reference/enumWithBigint.errors.txt similarity index 52% rename from tests/baselines/reference/enumWithBugint.errors.txt rename to tests/baselines/reference/enumWithBigint.errors.txt index 6d12a2a66fda2..a88660ce7c719 100644 --- a/tests/baselines/reference/enumWithBugint.errors.txt +++ b/tests/baselines/reference/enumWithBigint.errors.txt @@ -1,7 +1,7 @@ -enumWithBugint.ts(2,3): error TS2452: An enum member cannot have a numeric name. +enumWithBigint.ts(2,3): error TS2452: An enum member cannot have a numeric name. -==== enumWithBugint.ts (1 errors) ==== +==== enumWithBigint.ts (1 errors) ==== enum E { 0n = 0, ~~ diff --git a/tests/baselines/reference/enumWithBigint.js b/tests/baselines/reference/enumWithBigint.js new file mode 100644 index 0000000000000..9b8880af092a6 --- /dev/null +++ b/tests/baselines/reference/enumWithBigint.js @@ -0,0 +1,13 @@ +//// [tests/cases/compiler/enumWithBigint.ts] //// + +//// [enumWithBigint.ts] +enum E { + 0n = 0, +} + + +//// [enumWithBigint.js] +var E; +(function (E) { + E[E[0n] = 0] = 0n; +})(E || (E = {})); diff --git a/tests/baselines/reference/enumWithBigint.symbols b/tests/baselines/reference/enumWithBigint.symbols new file mode 100644 index 0000000000000..7f1b4d87aa91e --- /dev/null +++ b/tests/baselines/reference/enumWithBigint.symbols @@ -0,0 +1,10 @@ +//// [tests/cases/compiler/enumWithBigint.ts] //// + +=== enumWithBigint.ts === +enum E { +>E : Symbol(E, Decl(enumWithBigint.ts, 0, 0)) + + 0n = 0, +>0n : Symbol(E[0n], Decl(enumWithBigint.ts, 0, 8)) +} + diff --git a/tests/baselines/reference/enumWithBigint.types b/tests/baselines/reference/enumWithBigint.types new file mode 100644 index 0000000000000..8b38b838e6aeb --- /dev/null +++ b/tests/baselines/reference/enumWithBigint.types @@ -0,0 +1,14 @@ +//// [tests/cases/compiler/enumWithBigint.ts] //// + +=== enumWithBigint.ts === +enum E { +>E : E +> : ^ + + 0n = 0, +>0n : E.__missing +> : ^^^^^^^^^^^ +>0 : 0 +> : ^ +} + diff --git a/tests/baselines/reference/enumWithBugint.js b/tests/baselines/reference/enumWithBugint.js deleted file mode 100644 index 046d760182daf..0000000000000 --- a/tests/baselines/reference/enumWithBugint.js +++ /dev/null @@ -1,13 +0,0 @@ -//// [tests/cases/compiler/enumWithBugint.ts] //// - -//// [enumWithBugint.ts] -enum E { - 0n = 0, -} - - -//// [enumWithBugint.js] -var E; -(function (E) { - E[E[0n] = 0] = 0n; -})(E || (E = {})); diff --git a/tests/baselines/reference/enumWithBugint.symbols b/tests/baselines/reference/enumWithBugint.symbols deleted file mode 100644 index aaea0e622f301..0000000000000 --- a/tests/baselines/reference/enumWithBugint.symbols +++ /dev/null @@ -1,10 +0,0 @@ -//// [tests/cases/compiler/enumWithBugint.ts] //// - -=== enumWithBugint.ts === -enum E { ->E : Symbol(E, Decl(enumWithBugint.ts, 0, 0)) - - 0n = 0, ->0n : Symbol(E[0n], Decl(enumWithBugint.ts, 0, 8)) -} - diff --git a/tests/baselines/reference/enumWithBugint.types b/tests/baselines/reference/enumWithBugint.types deleted file mode 100644 index 69a0ef2dbd63b..0000000000000 --- a/tests/baselines/reference/enumWithBugint.types +++ /dev/null @@ -1,14 +0,0 @@ -//// [tests/cases/compiler/enumWithBugint.ts] //// - -=== enumWithBugint.ts === -enum E { ->E : E -> : ^ - - 0n = 0, ->0n : E.__missing -> : ^^^^^^^^^^^ ->0 : 0 -> : ^ -} - diff --git a/tests/cases/compiler/enumWithBugint.ts b/tests/cases/compiler/enumWithBigint.ts similarity index 100% rename from tests/cases/compiler/enumWithBugint.ts rename to tests/cases/compiler/enumWithBigint.ts From 959a2361f4a93d3c5ab1b98f80e78c564d81011a Mon Sep 17 00:00:00 2001 From: magic-akari Date: Wed, 28 May 2025 16:26:35 +0800 Subject: [PATCH 3/3] revert numeric literal fast path --- src/compiler/checker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index e17144c9fd3f3..4bb62fe6d1e6d 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -47542,7 +47542,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { if (isComputedNonLiteralName(member.name)) { error(member.name, Diagnostics.Computed_property_names_are_not_allowed_in_enums); } - else if (isNumericLiteral(member.name) || isBigIntLiteral(member.name)) { + else if (isBigIntLiteral(member.name)) { error(member.name, Diagnostics.An_enum_member_cannot_have_a_numeric_name); } else {