Skip to content

Fix crashes on malformed destructuring assignments during emit - #64651

Open
Mateusz Burzyński (Andarist) wants to merge 2 commits into
microsoft:mainfrom
Andarist:tolerate-malformed-destructuring-emit
Open

Mateusz Burzyński (Andarist) wants to merge 2 commits into
microsoft:mainfrom
Andarist:tolerate-malformed-destructuring-emit

Conversation

@Andarist

@Andarist Mateusz Burzyński (Andarist) commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

supersedes #63972 #63973 and #64472
fixes a crash reported here: #64458 (comment)

Those removed asserts assume a non-malformed source code. But those transformer paths still run over malformed nodes and it's the easiest to accept such subtrees given those malformed trees legitimately reach those visitors.

Alternatively, the fix could check if the target is valid or not and skip those "strict" (with asserts) visitors. But honestly, that seems like a more work/specialcasing and from what I've seen in the past the similar codepaths are just usually tolerant when it comes to malformed inputs like this so I think removing those asserts would match the preexisting style~

Copilot AI balanced review requested due to automatic review settings October 6, 2026 06:56
@typescript-automation typescript-automation Bot added For Uncommitted Bug PR for untriaged, rejected, closed or missing bug labels Oct 6, 2026
@typescript-automation

Copy link
Copy Markdown
Contributor

This PR doesn't have any linked issues. Please open an issue that references this PR. From there we can discuss and prioritise.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

The removed debug assertions should be broadened to valid container-level invariants rather than eliminated.

Review effort: Balanced
Findings: 3 Low severity

Open (3)
What changed in this PR

Prevents compiler emit crashes on malformed destructuring assignments across decorator and class-field transforms.

Changes:

  • Allows malformed assignment elements to continue through transform visitors.
  • Adds regression coverage for array/object targets, decorators, private fields, and super.
  • Adds diagnostic, emit, type, and symbol baselines.
File Description
tsc/​internal/​transformers/​estransforms/​esdecorator.go Relaxes assignment-element visitor assertions.
tsc/​internal/​transformers/​estransforms/​classfields.go Relaxes object-assignment visitor assertion.
tsc/​testdata/​tests/​cases/​compiler/​malformedSuperDestructuringInDecoratedClassStaticBlock.ts Tests malformed super destructuring.
tsc/​testdata/​tests/​cases/​compiler/​malformedObjectDestructuringAssignmentESDecorators.ts Tests malformed object targets with decorators.
tsc/​testdata/​tests/​cases/​compiler/​malformedObjectDestructuringAssignmentClassFields.ts Tests malformed private-field syntax.
tsc/​testdata/​tests/​cases/​compiler/​malformedDestructuringAssignmentTransformVariants.ts Covers transform and target variants.
tsc/​testdata/​baselines/​reference/​compiler/​malformedSuperDestructuringInDecoratedClassStaticBlock.types Type baseline.
tsc/​testdata/​baselines/​reference/​compiler/​malformedSuperDestructuringInDecoratedClassStaticBlock.symbols Symbol baseline.
tsc/​testdata/​baselines/​reference/​compiler/​malformedSuperDestructuringInDecoratedClassStaticBlock.js Emit baseline.
tsc/​testdata/​baselines/​reference/​compiler/​malformedSuperDestructuringInDecoratedClassStaticBlock.errors.txt Diagnostic baseline.
tsc/​testdata/​baselines/​reference/​compiler/​malformedObjectDestructuringAssignmentESDecorators.types Type baseline.
tsc/​testdata/​baselines/​reference/​compiler/​malformedObjectDestructuringAssignmentESDecorators.symbols Symbol baseline.
tsc/​testdata/​baselines/​reference/​compiler/​malformedObjectDestructuringAssignmentESDecorators.js Emit baseline.
tsc/​testdata/​baselines/​reference/​compiler/​malformedObjectDestructuringAssignmentESDecorators.errors.txt Diagnostic baseline.
tsc/​testdata/​baselines/​reference/​compiler/​malformedObjectDestructuringAssignmentClassFields.types Type baseline.
tsc/​testdata/​baselines/​reference/​compiler/​malformedObjectDestructuringAssignmentClassFields.symbols Symbol baseline.
tsc/​testdata/​baselines/​reference/​compiler/​malformedObjectDestructuringAssignmentClassFields.js Emit baseline.
tsc/​testdata/​baselines/​reference/​compiler/​malformedObjectDestructuringAssignmentClassFields.errors.txt Diagnostic baseline.
tsc/​testdata/​baselines/​reference/​compiler/​malformedDestructuringAssignmentTransformVariants(experimentaldecorators=true,target=es2022).js Legacy-decorator ES2022 emit baseline.
tsc/​testdata/​baselines/​reference/​compiler/​malformedDestructuringAssignmentTransformVariants(experimentaldecorators=true,target=es2022).errors.txt Legacy-decorator ES2022 diagnostics.
tsc/​testdata/​baselines/​reference/​compiler/​malformedDestructuringAssignmentTransformVariants(experimentaldecorators=true,target=es2015).js Legacy-decorator ES2015 emit baseline.
tsc/​testdata/​baselines/​reference/​compiler/​malformedDestructuringAssignmentTransformVariants(experimentaldecorators=true,target=es2015).errors.txt Legacy-decorator ES2015 diagnostics.
tsc/​testdata/​baselines/​reference/​compiler/​malformedDestructuringAssignmentTransformVariants(experimentaldecorators=false,target=es2022).js ES-decorator ES2022 emit baseline.
tsc/​testdata/​baselines/​reference/​compiler/​malformedDestructuringAssignmentTransformVariants(experimentaldecorators=false,target=es2022).errors.txt ES-decorator ES2022 diagnostics.
tsc/​testdata/​baselines/​reference/​compiler/​malformedDestructuringAssignmentTransformVariants(experimentaldecorators=false,target=es2015).js ES-decorator ES2015 emit baseline.
tsc/​testdata/​baselines/​reference/​compiler/​malformedDestructuringAssignmentTransformVariants(experimentaldecorators=false,target=es2015).errors.txt ES-decorator ES2015 diagnostics.

💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.

Comment thread tsc/internal/transformers/estransforms/classfields.go
Comment thread tsc/internal/transformers/estransforms/esdecorator.go
Comment thread tsc/internal/transformers/estransforms/esdecorator.go

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

For Uncommitted Bug PR for untriaged, rejected, closed or missing bug

Projects

Status: Not started

Development

Successfully merging this pull request may close these issues.

2 participants