From 9711ecc80d130be155b8b3018b968c2ba42c4b64 Mon Sep 17 00:00:00 2001 From: Cold Fry Date: Tue, 14 Apr 2026 07:12:52 +0000 Subject: [PATCH 1/2] fix array destructuring not preserving evaluation order with side effects (#1405) --- src/transformation/visitors/variable-declaration.ts | 4 ++-- test/unit/destructuring.spec.ts | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/transformation/visitors/variable-declaration.ts b/src/transformation/visitors/variable-declaration.ts index f15ed0115..61d50cad4 100644 --- a/src/transformation/visitors/variable-declaration.ts +++ b/src/transformation/visitors/variable-declaration.ts @@ -12,7 +12,7 @@ import { createCallableTable, isFunctionTypeWithProperties } from "./function"; import { transformIdentifier } from "./identifier"; import { isMultiReturnCall } from "./language-extensions/multi"; import { transformPropertyName } from "./literal"; -import { moveToPrecedingTemp } from "./expression-list"; +import { moveToPrecedingTemp, transformExpressionList } from "./expression-list"; export function transformArrayBindingElement( context: TransformationContext, @@ -205,7 +205,7 @@ export function transformBindingVariableDeclaration( // Don't unpack array literals const values = initializer.elements.length > 0 - ? initializer.elements.map(e => context.transformExpression(e)) + ? transformExpressionList(context, initializer.elements) : lua.createNilLiteral(); statements.push(...createLocalOrExportedOrGlobalDeclaration(context, vars, values, initializer)); } else { diff --git a/test/unit/destructuring.spec.ts b/test/unit/destructuring.spec.ts index 65ecf95a3..b525e2cf8 100644 --- a/test/unit/destructuring.spec.ts +++ b/test/unit/destructuring.spec.ts @@ -226,6 +226,15 @@ describe("array destructuring optimization", () => { .expectToMatchJsResult(); }); + test("array literal with side effects in elements", () => { + util.testFunction` + const arr = [1, 2]; + let i = 0; + let [v1, v2] = [arr[i], arr[++i]]; + return { v1, v2 }; + `.expectToMatchJsResult(); + }); + test("array union", () => { util.testFunction` const array: [string] | [] = ["bar"]; From 556cd1f2027f1fbf3c377f29b3ff66f0dc1b53ad Mon Sep 17 00:00:00 2001 From: Cold Fry Date: Tue, 14 Apr 2026 07:26:10 +0000 Subject: [PATCH 2/2] add more test cases for array destructuring side effects --- test/unit/destructuring.spec.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/test/unit/destructuring.spec.ts b/test/unit/destructuring.spec.ts index b525e2cf8..4820876a4 100644 --- a/test/unit/destructuring.spec.ts +++ b/test/unit/destructuring.spec.ts @@ -235,6 +235,24 @@ describe("array destructuring optimization", () => { `.expectToMatchJsResult(); }); + test("array literal with many side effects in elements", () => { + util.testFunction` + const arr = [10, 20, 30, 40]; + let i = 0; + let [v1, v2, v3, v4] = [arr[i++], arr[i++], arr[i++], arr[i++]]; + return { v1, v2, v3, v4 }; + `.expectToMatchJsResult(); + }); + + test("array literal with mixed pure and impure elements", () => { + util.testFunction` + const arr = [10, 20, 30]; + let i = 0; + let [v1, v2, v3] = [1, arr[++i], 2]; + return { v1, v2, v3, i }; + `.expectToMatchJsResult(); + }); + test("array union", () => { util.testFunction` const array: [string] | [] = ["bar"];