#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 Inner {
  half2x4 m;
};
struct Outer {
  tint_array<Inner, 4> a;
};
struct tint_module_vars_struct {
  const constant tint_array<Outer, 4>* a;
};

kernel void f(const constant tint_array<Outer, 4>* a [[buffer(0)]]) {
  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.a=a};
  const constant tint_array<Outer, 4>* const p_a = tint_module_vars.a;
  const constant Outer* const p_a_3 = (&(*p_a)[3]);
  const constant tint_array<Inner, 4>* const p_a_3_a = (&(*p_a_3).a);
  const constant Inner* const p_a_3_a_2 = (&(*p_a_3_a)[2]);
  const constant half2x4* const p_a_3_a_2_m = (&(*p_a_3_a_2).m);
  const constant half4* const p_a_3_a_2_m_1 = (&(*p_a_3_a_2_m)[1]);
  tint_array<Outer, 4> const l_a = (*p_a);
  Outer const l_a_3 = (*p_a_3);
  tint_array<Inner, 4> const l_a_3_a = (*p_a_3_a);
  Inner const l_a_3_a_2 = (*p_a_3_a_2);
  half2x4 const l_a_3_a_2_m = (*p_a_3_a_2_m);
  half4 const l_a_3_a_2_m_1 = (*p_a_3_a_2_m_1);
  half const l_a_3_a_2_m_1_0 = (*p_a_3_a_2_m_1)[0];
}
