type ArrayType = [[stride(16)]] array<i32, 4>;

[[block]]
struct S {
  arr : ArrayType;
};

var<private> src_private : ArrayType;

var<workgroup> src_workgroup : ArrayType;

[[group(0), binding(0)]] var<uniform> src_uniform : S;

[[group(0), binding(1)]] var<storage, read_write> src_storage : S;

var<private> dst : ArrayType;

var<private> dst_nested : array<array<array<i32, 2>, 3>, 4>;

fn ret_arr() -> ArrayType {
  return ArrayType();
}

fn ret_struct_arr() -> S {
  return S();
}

fn foo(src_param : ArrayType) {
  var src_function : ArrayType;
  dst = ArrayType(1, 2, 3, 3);
  dst = src_param;
  dst = ret_arr();
  let src_let : ArrayType = ArrayType();
  dst = src_let;
  dst = src_function;
  dst = src_private;
  dst = src_workgroup;
  dst = ret_struct_arr().arr;
  dst = src_uniform.arr;
  dst = src_storage.arr;
  var src_nested : array<array<array<i32, 2>, 3>, 4>;
  dst_nested = src_nested;
}