#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 {
  /* 0x0000 */ int arr[2];
};
struct tint_array_wrapper_2 {
  /* 0x0000 */ tint_array_wrapper_3 arr[3];
};
struct tint_array_wrapper_1 {
  /* 0x0000 */ tint_array_wrapper_2 arr[4];
};
struct S_nested {
  /* 0x0000 */ tint_array_wrapper_1 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;
}

void foo(tint_array_wrapper src_param, device S* 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, device S_nested* 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)).arr = tint_symbol_2;
  (*(tint_symbol_3)).arr = src_param;
  (*(tint_symbol_3)).arr = ret_arr();
  tint_array_wrapper const src_let = {.arr={}};
  (*(tint_symbol_3)).arr = src_let;
  (*(tint_symbol_3)).arr = src_function;
  (*(tint_symbol_3)).arr = *(tint_symbol_4);
  (*(tint_symbol_3)).arr = *(tint_symbol_5);
  (*(tint_symbol_3)).arr = ret_struct_arr().arr;
  (*(tint_symbol_3)).arr = (*(tint_symbol_6)).arr;
  (*(tint_symbol_3)).arr = (*(tint_symbol_7)).arr;
  tint_array_wrapper_1 src_nested = {};
  (*(tint_symbol_8)).arr = src_nested;
}

