#include <metal_stdlib>

using namespace metal;
struct tint_array_wrapper {
  /* 0x0000 */ int4 arr[4];
};

struct S {
  /* 0x0000 */ tint_array_wrapper arr;
};

tint_array_wrapper ret_arr() {
  tint_array_wrapper const tint_symbol = {.arr={}};
  return tint_symbol;
}

S ret_struct_arr() {
  S const tint_symbol_1 = {};
  return tint_symbol_1;
}

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 foo(tint_array_wrapper src_param, thread tint_array_wrapper* const tint_symbol_3, threadgroup tint_array_wrapper* const tint_symbol_4, const constant S* const tint_symbol_5, device S* const tint_symbol_6) {
  tint_array_wrapper src_function = {};
  tint_array_wrapper dst = {};
  tint_array_wrapper const tint_symbol_2 = {.arr={int4(1), int4(2), int4(3), int4(3)}};
  dst = tint_symbol_2;
  dst = src_param;
  dst = ret_arr();
  tint_array_wrapper const src_let = {.arr={}};
  dst = src_let;
  dst = src_function;
  dst = *(tint_symbol_3);
  dst = *(tint_symbol_4);
  dst = ret_struct_arr().arr;
  dst = (*(tint_symbol_5)).arr;
  dst = (*(tint_symbol_6)).arr;
  tint_array_wrapper_1 dst_nested = {};
  tint_array_wrapper_1 src_nested = {};
  dst_nested = src_nested;
}

