#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 S {
  float a;
};
struct tint_module_vars_struct {
  thread bool* bool_var;
  thread int* i32_var;
  thread uint* u32_var;
  thread float* f32_var;
  thread int2* v2i32_var;
  thread uint3* v3u32_var;
  thread float4* v4f32_var;
  thread float2x3* m2x3_var;
  thread tint_array<float, 4>* arr_var;
  thread S* struct_var;
};

kernel void tint_symbol() {
  thread bool bool_var = false;
  thread int i32_var = 0;
  thread uint u32_var = 0u;
  thread float f32_var = 0.0f;
  thread int2 v2i32_var = int2(0);
  thread uint3 v3u32_var = uint3(0u);
  thread float4 v4f32_var = float4(0.0f);
  thread float2x3 m2x3_var = float2x3(float3(0.0f), float3(0.0f));
  thread tint_array<float, 4> arr_var = tint_array<float, 4>{};
  thread S struct_var = S{};
  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.bool_var=(&bool_var), .i32_var=(&i32_var), .u32_var=(&u32_var), .f32_var=(&f32_var), .v2i32_var=(&v2i32_var), .v3u32_var=(&v3u32_var), .v4f32_var=(&v4f32_var), .m2x3_var=(&m2x3_var), .arr_var=(&arr_var), .struct_var=(&struct_var)};
  (*tint_module_vars.bool_var) = false;
  (*tint_module_vars.i32_var) = 0;
  (*tint_module_vars.u32_var) = 0u;
  (*tint_module_vars.f32_var) = 0.0f;
  (*tint_module_vars.v2i32_var) = int2(0);
  (*tint_module_vars.v3u32_var) = uint3(0u);
  (*tint_module_vars.v4f32_var) = float4(0.0f);
  (*tint_module_vars.m2x3_var) = float2x3(float3(0.0f), float3(0.0f));
  (*tint_module_vars.arr_var) = tint_array<float, 4>{};
  (*tint_module_vars.struct_var) = S{};
}
