#include <metal_stdlib>

using namespace metal;
struct tint_array_wrapper {
  /* 0x0000 */ int4 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={int4(1), int4(2), int4(3), int4(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;
}

