@ 261110.11
current
// Copyright 2026 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Flags: --allow-natives-syntax --maglev --turbolev --array-destructure-bytecode

(function TestDestructuringAsValueExpression() {
  let a, b;
  let arr = [10, 20];
  let res = ([a, b] = arr);
  assertEquals(arr, res);
  assertEquals(10, a);
  assertEquals(20, b);
})();

(function TestDestructuringInReturnStatement() {
  function f(arr) {
    let x, y;
    return ([x, y] = arr);
  }

  %PrepareFunctionForOptimization(f);
  let arr = [30, 40];
  assertEquals(arr, f(arr));
  assertEquals(arr, f(arr));
  %OptimizeFunctionOnNextCall(f);
  assertEquals(arr, f(arr));
  assertOptimized(f);
})();

(function TestChainedDestructuringAssignments() {
  function f(arr) {
    let a, b, c, d;
    let res = ([a, b] = ([c, d] = arr));
    assertEquals(arr, res);
    return a + b + c + d;
  }

  %PrepareFunctionForOptimization(f);
  assertEquals(220, f([50, 60]));
  assertEquals(220, f([50, 60]));
  %OptimizeFunctionOnNextCall(f);
  assertEquals(220, f([50, 60]));
  assertOptimized(f);
})();

(function TestDestructuringWithDefaultValuesInExpression() {
  function f(arr) {
    let x, y;
    return ([x = 100, y = 200] = arr);
  }

  %PrepareFunctionForOptimization(f);
  let arr1 = [5, undefined];
  assertEquals(arr1, f(arr1));
  %OptimizeFunctionOnNextCall(f);
  assertEquals(arr1, f(arr1));
  assertOptimized(f);
})();

(function TestDestructuringWithHoles() {
  function f(arr) {
    let x, z;
    return ([x, , z] = arr);
  }

  %PrepareFunctionForOptimization(f);
  let arr = [10, 20, 30];
  assertEquals(arr, f(arr));
  assertEquals(arr, f(arr));
  %OptimizeFunctionOnNextCall(f);
  assertEquals(arr, f(arr));
  assertOptimized(f);
})();