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

tint_array<float, 4> f1() {
  tint_array<float, 4> const tint_symbol_6 = tint_array<float, 4>{};
  return tint_symbol_6;
}

tint_array<tint_array<float, 4>, 3> f2() {
  tint_array<float, 4> const tint_symbol_1 = f1();
  tint_array<float, 4> const tint_symbol_2 = f1();
  tint_array<float, 4> const tint_symbol_3 = f1();
  tint_array<tint_array<float, 4>, 3> const tint_symbol_7 = tint_array<tint_array<float, 4>, 3>{tint_symbol_1, tint_symbol_2, tint_symbol_3};
  return tint_symbol_7;
}

tint_array<tint_array<tint_array<float, 4>, 3>, 2> f3() {
  tint_array<tint_array<float, 4>, 3> const tint_symbol_4 = f2();
  tint_array<tint_array<float, 4>, 3> const tint_symbol_5 = f2();
  tint_array<tint_array<tint_array<float, 4>, 3>, 2> const tint_symbol_8 = tint_array<tint_array<tint_array<float, 4>, 3>, 2>{tint_symbol_4, tint_symbol_5};
  return tint_symbol_8;
}

kernel void tint_symbol() {
  tint_array<float, 4> const a1 = f1();
  tint_array<tint_array<float, 4>, 3> const a2 = f2();
  tint_array<tint_array<tint_array<float, 4>, 3>, 2> const a3 = f3();
  return;
}

