From 5bbedac7fc2cab8c4b8c966b323f44eda73885b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Sun, 23 Aug 2026 09:56:47 +0200 Subject: [PATCH] Fix crash on malformed object destructuring assignment --- .../transformers/estransforms/classfields.go | 1 - ...tructuringAssignmentClassFields.errors.txt | 20 +++++++++++++++++++ ...bjectDestructuringAssignmentClassFields.js | 10 ++++++++++ ...DestructuringAssignmentClassFields.symbols | 8 ++++++++ ...ctDestructuringAssignmentClassFields.types | 15 ++++++++++++++ ...bjectDestructuringAssignmentClassFields.ts | 1 + 6 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 tsc/testdata/baselines/reference/compiler/malformedObjectDestructuringAssignmentClassFields.errors.txt create mode 100644 tsc/testdata/baselines/reference/compiler/malformedObjectDestructuringAssignmentClassFields.js create mode 100644 tsc/testdata/baselines/reference/compiler/malformedObjectDestructuringAssignmentClassFields.symbols create mode 100644 tsc/testdata/baselines/reference/compiler/malformedObjectDestructuringAssignmentClassFields.types create mode 100644 tsc/testdata/tests/cases/compiler/malformedObjectDestructuringAssignmentClassFields.ts diff --git a/tsc/internal/transformers/estransforms/classfields.go b/tsc/internal/transformers/estransforms/classfields.go index 68dc3950413d9..02742c9571cb5 100644 --- a/tsc/internal/transformers/estransforms/classfields.go +++ b/tsc/internal/transformers/estransforms/classfields.go @@ -3318,7 +3318,6 @@ func (tx *classFieldsTransformer) visitAssignmentRestProperty(node *ast.Node) *a } func (tx *classFieldsTransformer) visitObjectAssignmentElement(node *ast.Node) *ast.Node { - debug.Assert(node != nil && ast.IsObjectBindingOrAssignmentElement(node)) if ast.IsSpreadAssignment(node) { return tx.visitAssignmentRestProperty(node) } diff --git a/tsc/testdata/baselines/reference/compiler/malformedObjectDestructuringAssignmentClassFields.errors.txt b/tsc/testdata/baselines/reference/compiler/malformedObjectDestructuringAssignmentClassFields.errors.txt new file mode 100644 index 0000000000000..87e4aba639e60 --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/malformedObjectDestructuringAssignmentClassFields.errors.txt @@ -0,0 +1,20 @@ +malformedObjectDestructuringAssignmentClassFields.ts(1,3): error TS1136: Property assignment expected. +malformedObjectDestructuringAssignmentClassFields.ts(1,6): error TS1005: ',' expected. +malformedObjectDestructuringAssignmentClassFields.ts(1,7): error TS1127: Invalid character. +malformedObjectDestructuringAssignmentClassFields.ts(1,10): error TS1109: Expression expected. +malformedObjectDestructuringAssignmentClassFields.ts(2,1): error TS1005: ')' expected. + + +==== malformedObjectDestructuringAssignmentClassFields.ts (5 errors) ==== + ({x(A.#}= + ~ +!!! error TS1136: Property assignment expected. + ~ +!!! error TS1005: ',' expected. + ~ +!!! error TS1127: Invalid character. + +!!! error TS1109: Expression expected. + + +!!! error TS1005: ')' expected. \ No newline at end of file diff --git a/tsc/testdata/baselines/reference/compiler/malformedObjectDestructuringAssignmentClassFields.js b/tsc/testdata/baselines/reference/compiler/malformedObjectDestructuringAssignmentClassFields.js new file mode 100644 index 0000000000000..1416d26fea47e --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/malformedObjectDestructuringAssignmentClassFields.js @@ -0,0 +1,10 @@ +//// [tests/cases/compiler/malformedObjectDestructuringAssignmentClassFields.ts] //// + +//// [malformedObjectDestructuringAssignmentClassFields.ts] +({x(A.#}= + + +//// [malformedObjectDestructuringAssignmentClassFields.js] +"use strict"; +({ x(A) { }, : .# } = +); diff --git a/tsc/testdata/baselines/reference/compiler/malformedObjectDestructuringAssignmentClassFields.symbols b/tsc/testdata/baselines/reference/compiler/malformedObjectDestructuringAssignmentClassFields.symbols new file mode 100644 index 0000000000000..ec5eb7d8d85c9 --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/malformedObjectDestructuringAssignmentClassFields.symbols @@ -0,0 +1,8 @@ +//// [tests/cases/compiler/malformedObjectDestructuringAssignmentClassFields.ts] //// + +=== malformedObjectDestructuringAssignmentClassFields.ts === +({x(A.#}= +>x : Symbol(x, Decl(malformedObjectDestructuringAssignmentClassFields.ts, 0, 2)) +>A : Symbol(A, Decl(malformedObjectDestructuringAssignmentClassFields.ts, 0, 4)) +> : Symbol((Missing), Decl(malformedObjectDestructuringAssignmentClassFields.ts, 0, 5)) + diff --git a/tsc/testdata/baselines/reference/compiler/malformedObjectDestructuringAssignmentClassFields.types b/tsc/testdata/baselines/reference/compiler/malformedObjectDestructuringAssignmentClassFields.types new file mode 100644 index 0000000000000..46e410d3b1385 --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/malformedObjectDestructuringAssignmentClassFields.types @@ -0,0 +1,15 @@ +//// [tests/cases/compiler/malformedObjectDestructuringAssignmentClassFields.ts] //// + +=== malformedObjectDestructuringAssignmentClassFields.ts === +({x(A.#}= +>({x(A.#}= : any +>{x(A.#}= : any +>{x(A.#} : { x(A: any): any; "": any; } +>x : (A: any) => any +>A : any +> : any +>.# : any +> : any + +> : any + diff --git a/tsc/testdata/tests/cases/compiler/malformedObjectDestructuringAssignmentClassFields.ts b/tsc/testdata/tests/cases/compiler/malformedObjectDestructuringAssignmentClassFields.ts new file mode 100644 index 0000000000000..fef8375cad5cd --- /dev/null +++ b/tsc/testdata/tests/cases/compiler/malformedObjectDestructuringAssignmentClassFields.ts @@ -0,0 +1 @@ +({x(A.#}=