[numthreads(1, 1, 1)]
void unused_entry_point() {
  return;
}

struct tint_padded_array_element {
  int el;
};
struct tint_array_wrapper {
  tint_padded_array_element arr[4];
};
struct S {
  tint_array_wrapper arr;
};

tint_array_wrapper tint_symbol_2(uint4 buffer[4], uint offset) {
  const uint scalar_offset = ((offset + 0u)) / 4;
  const uint scalar_offset_1 = ((offset + 16u)) / 4;
  const uint scalar_offset_2 = ((offset + 32u)) / 4;
  const uint scalar_offset_3 = ((offset + 48u)) / 4;
  const tint_array_wrapper tint_symbol_11 = {{{asint(buffer[scalar_offset / 4][scalar_offset % 4])}, {asint(buffer[scalar_offset_1 / 4][scalar_offset_1 % 4])}, {asint(buffer[scalar_offset_2 / 4][scalar_offset_2 % 4])}, {asint(buffer[scalar_offset_3 / 4][scalar_offset_3 % 4])}}};
  return tint_symbol_11;
}

tint_array_wrapper tint_symbol_4(RWByteAddressBuffer buffer, uint offset) {
  const tint_array_wrapper tint_symbol_12 = {{{asint(buffer.Load((offset + 0u)))}, {asint(buffer.Load((offset + 16u)))}, {asint(buffer.Load((offset + 32u)))}, {asint(buffer.Load((offset + 48u)))}}};
  return tint_symbol_12;
}

void tint_symbol_6(RWByteAddressBuffer buffer, uint offset, tint_array_wrapper value) {
  buffer.Store((offset + 0u), asuint(value.arr[0u].el));
  buffer.Store((offset + 16u), asuint(value.arr[1u].el));
  buffer.Store((offset + 32u), asuint(value.arr[2u].el));
  buffer.Store((offset + 48u), asuint(value.arr[3u].el));
}

struct tint_array_wrapper_3 {
  int arr[2];
};
struct tint_array_wrapper_2 {
  tint_array_wrapper_3 arr[3];
};
struct tint_array_wrapper_1 {
  tint_array_wrapper_2 arr[4];
};

void tint_symbol_8(RWByteAddressBuffer buffer, uint offset, tint_array_wrapper_3 value) {
  buffer.Store((offset + 0u), asuint(value.arr[0u]));
  buffer.Store((offset + 4u), asuint(value.arr[1u]));
}

void tint_symbol_9(RWByteAddressBuffer buffer, uint offset, tint_array_wrapper_2 value) {
  tint_symbol_8(buffer, (offset + 0u), value.arr[0u]);
  tint_symbol_8(buffer, (offset + 8u), value.arr[1u]);
  tint_symbol_8(buffer, (offset + 16u), value.arr[2u]);
}

void tint_symbol_10(RWByteAddressBuffer buffer, uint offset, tint_array_wrapper_1 value) {
  tint_symbol_9(buffer, (offset + 0u), value.arr[0u]);
  tint_symbol_9(buffer, (offset + 24u), value.arr[1u]);
  tint_symbol_9(buffer, (offset + 48u), value.arr[2u]);
  tint_symbol_9(buffer, (offset + 72u), value.arr[3u]);
}

static tint_array_wrapper src_private = (tint_array_wrapper)0;
groupshared tint_array_wrapper src_workgroup;
cbuffer cbuffer_src_uniform : register(b0, space0) {
  uint4 src_uniform[4];
};
RWByteAddressBuffer src_storage : register(u1, space0);
RWByteAddressBuffer tint_symbol : register(u2, space0);
RWByteAddressBuffer dst_nested : register(u3, space0);

tint_array_wrapper ret_arr() {
  const tint_array_wrapper tint_symbol_13 = {(tint_padded_array_element[4])0};
  return tint_symbol_13;
}

S ret_struct_arr() {
  const S tint_symbol_14 = (S)0;
  return tint_symbol_14;
}

void foo(tint_array_wrapper src_param) {
  tint_array_wrapper src_function = (tint_array_wrapper)0;
  const tint_array_wrapper tint_symbol_15 = {{{1}, {2}, {3}, {3}}};
  tint_symbol_6(tint_symbol, 0u, tint_symbol_15);
  tint_symbol_6(tint_symbol, 0u, src_param);
  tint_symbol_6(tint_symbol, 0u, ret_arr());
  const tint_array_wrapper src_let = {(tint_padded_array_element[4])0};
  tint_symbol_6(tint_symbol, 0u, src_let);
  tint_symbol_6(tint_symbol, 0u, src_function);
  tint_symbol_6(tint_symbol, 0u, src_private);
  tint_symbol_6(tint_symbol, 0u, src_workgroup);
  tint_symbol_6(tint_symbol, 0u, ret_struct_arr().arr);
  tint_symbol_6(tint_symbol, 0u, tint_symbol_2(src_uniform, 0u));
  tint_symbol_6(tint_symbol, 0u, tint_symbol_4(src_storage, 0u));
  tint_array_wrapper_1 src_nested = (tint_array_wrapper_1)0;
  tint_symbol_10(dst_nested, 0u, src_nested);
}
