#include <metal_stdlib>

using namespace metal;
struct tint_padded_array_element {
  /* 0x0000 */ int el;
  /* 0x0004 */ int8_t tint_pad[12];
};
struct tint_array_wrapper {
  /* 0x0000 */ tint_padded_array_element arr[4];
};
struct S {
  /* 0x0000 */ tint_array_wrapper arr;
};
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];
};

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;
}

void foo(tint_array_wrapper src_param, thread tint_array_wrapper* const tint_symbol_3, thread tint_array_wrapper* const tint_symbol_4, threadgroup tint_array_wrapper* const tint_symbol_5, const constant S* const tint_symbol_6, device S* const tint_symbol_7, thread tint_array_wrapper_1* const tint_symbol_8) {
  tint_array_wrapper src_function = {};
  tint_array_wrapper const tint_symbol_2 = {.arr={{.el=1}, {.el=2}, {.el=3}, {.el=3}}};
  *(tint_symbol_3) = tint_symbol_2;
  *(tint_symbol_3) = src_param;
  *(tint_symbol_3) = ret_arr();
  tint_array_wrapper const src_let = {.arr={}};
  *(tint_symbol_3) = src_let;
  *(tint_symbol_3) = src_function;
  *(tint_symbol_3) = *(tint_symbol_4);
  *(tint_symbol_3) = *(tint_symbol_5);
  *(tint_symbol_3) = ret_struct_arr().arr;
  *(tint_symbol_3) = (*(tint_symbol_6)).arr;
  *(tint_symbol_3) = (*(tint_symbol_7)).arr;
  tint_array_wrapper_1 src_nested = {};
  *(tint_symbol_8) = src_nested;
}

