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

#define TINT_ISOLATE_UB(VOLATILE_NAME) \
  volatile bool VOLATILE_NAME = true; \
  if (VOLATILE_NAME)

struct str {
  int i;
};

void tint_zero_workgroup_memory(uint local_idx, threadgroup tint_array<str, 4>* const tint_symbol_3) {
  TINT_ISOLATE_UB(tint_volatile_true) for(uint idx = local_idx; (idx < 4u); idx = (idx + 1u)) {
    uint const i_1 = idx;
    str const tint_symbol_1 = str{};
    (*(tint_symbol_3))[i_1] = tint_symbol_1;
  }
  threadgroup_barrier(mem_flags::mem_threadgroup);
}

void func(threadgroup str* const pointer) {
  str const tint_symbol_2 = str{};
  *(pointer) = tint_symbol_2;
}

void tint_symbol_inner(uint local_invocation_index, threadgroup tint_array<str, 4>* const tint_symbol_4) {
  tint_zero_workgroup_memory(local_invocation_index, tint_symbol_4);
  func(&((*(tint_symbol_4))[2]));
}

kernel void tint_symbol(uint local_invocation_index [[thread_index_in_threadgroup]]) {
  threadgroup tint_array<str, 4> tint_symbol_5;
  tint_symbol_inner(local_invocation_index, &(tint_symbol_5));
  return;
}

