[[stage(compute), workgroup_size(1)]]
fn main() {
  let x : i32 = 42;

  // Test basic usage.
  let empty : array<i32, 4> = array<i32, 4>();
  let nonempty : array<i32, 4> = array<i32, 4>(1, 2, 3, 4);
  let nonempty_with_expr : array<i32, 4> =
    array<i32, 4>(1, x, x + 1, nonempty[3]);

  // Test nested arrays.
  let nested_empty : array<array<array<i32, 4>, 3>, 2> =
    array<array<array<i32, 4>, 3>, 2>();
  let nested_nonempty : array<array<array<i32, 4>, 3>, 2> =
    array<array<array<i32, 4>, 3>, 2>(
      array<array<i32, 4>, 3>(
        array<i32, 4>(1, 2, 3, 4),
        array<i32, 4>(5, 6, 7, 8),
        array<i32, 4>(9, 10, 11, 12)),
      array<array<i32, 4>, 3>(
        array<i32, 4>(13, 14, 15, 16),
        array<i32, 4>(17, 18, 19, 20),
        array<i32, 4>(21, 22, 23, 24)));
  let nested_nonempty_with_expr : array<array<array<i32, 4>, 3>, 2> =
    array<array<array<i32, 4>, 3>, 2>(
      array<array<i32, 4>, 3>(
        array<i32, 4>(1, 2, x, x + 1),
        array<i32, 4>(5, 6, nonempty[2], nonempty[3] + 1),
        nonempty),
      nested_nonempty[1]);

  // Test use of constructors as sub-expressions.
  let subexpr_empty : i32 = array<i32, 4>()[1];
  let subexpr_nonempty : i32 = array<i32, 4>(1, 2, 3, 4)[2];
  let subexpr_nonempty_with_expr : i32 =
    array<i32, 4>(1, x, x + 1, nonempty[3])[2];
  let subexpr_nested_empty : array<i32, 4> = array<array<i32, 4>, 2>()[1];
  let subexpr_nested_nonempty : array<i32, 4> =
    array<array<i32, 4>, 2>(
      array<i32, 4>(1, 2, 3, 4),
      array<i32, 4>(5, 6, 7, 8)
    )[1];
  let subexpr_nested_nonempty_with_expr : array<i32, 4> =
    array<array<i32, 4>, 2>(
      array<i32, 4>(1, x, x + 1, nonempty[3]),
      nested_nonempty[1][2],
    )[1];
}
