#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 S {
  tint_array<int, 64> data;
};

void tint_zero_workgroup_memory(uint local_idx, threadgroup S* const tint_symbol) {
  TINT_ISOLATE_UB(tint_volatile_true) for(uint idx = local_idx; (idx < 64u); idx = (idx + 1u)) {
    uint const i = idx;
    (*(tint_symbol)).data[i] = 0;
  }
  threadgroup_barrier(mem_flags::mem_threadgroup);
}

struct UBO {
  /* 0x0000 */ int dynamic_idx;
};

struct Result {
  /* 0x0000 */ int out;
};

void f_inner(uint local_invocation_index, threadgroup S* const tint_symbol_1, const constant UBO* const tint_symbol_2, device Result* const tint_symbol_3) {
  tint_zero_workgroup_memory(local_invocation_index, tint_symbol_1);
  (*(tint_symbol_1)).data[(*(tint_symbol_2)).dynamic_idx] = 1;
  (*(tint_symbol_3)).out = (*(tint_symbol_1)).data[3];
}

kernel void f(const constant UBO* tint_symbol_5 [[buffer(0)]], device Result* tint_symbol_6 [[buffer(1)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
  threadgroup S tint_symbol_4;
  f_inner(local_invocation_index, &(tint_symbol_4), tint_symbol_5, tint_symbol_6);
  return;
}

