#include <metal_stdlib>

using namespace metal;

template<typename T, size_t N>
struct tint_array {
    const constant T& operator[](size_t i) const constant { return elements[i]; }
    device T& operator[](size_t i) device { return elements[i]; }
    const device T& operator[](size_t i) const device { return elements[i]; }
    thread T& operator[](size_t i) thread { return elements[i]; }
    const thread T& operator[](size_t i) const thread { return elements[i]; }
    threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
    const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
    T elements[N];
};

struct tint_private_vars_struct {
  tint_array<int4, 4> src_private;
};

struct S {
  /* 0x0000 */ tint_array<int4, 4> arr;
};

struct S_nested {
  /* 0x0000 */ tint_array<tint_array<tint_array<int, 2>, 3>, 4> arr;
};

tint_array<int4, 4> ret_arr() {
  tint_array<int4, 4> const tint_symbol_1 = tint_array<int4, 4>{};
  return tint_symbol_1;
}

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

void foo(tint_array<int4, 4> src_param, thread tint_private_vars_struct* const tint_private_vars, device S* const tint_symbol_4, threadgroup tint_array<int4, 4>* 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<int4, 4> src_function = {};
  tint_array<int4, 4> const tint_symbol_3 = tint_array<int4, 4>{int4(1), int4(2), int4(3), int4(3)};
  (*(tint_symbol_4)).arr = tint_symbol_3;
  (*(tint_symbol_4)).arr = src_param;
  (*(tint_symbol_4)).arr = ret_arr();
  tint_array<int4, 4> const src_let = tint_array<int4, 4>{};
  (*(tint_symbol_4)).arr = src_let;
  (*(tint_symbol_4)).arr = src_function;
  (*(tint_symbol_4)).arr = (*(tint_private_vars)).src_private;
  (*(tint_symbol_4)).arr = *(tint_symbol_5);
  S const tint_symbol = ret_struct_arr();
  (*(tint_symbol_4)).arr = tint_symbol.arr;
  (*(tint_symbol_4)).arr = (*(tint_symbol_6)).arr;
  (*(tint_symbol_4)).arr = (*(tint_symbol_7)).arr;
  tint_array<tint_array<tint_array<int, 2>, 3>, 4> src_nested = {};
  (*(tint_symbol_8)).arr = src_nested;
}

