#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 S1 {
  int a;
  int b;
  int c;
  int d;
};

struct S2 {
  int e;
  S1 f;
};

struct S3 {
  int g;
  S1 h;
  S2 i;
};

struct T {
  tint_array<int, 2> a;
};

kernel void tint_symbol() {
  int const x = 42;
  S1 const empty = {};
  S1 const nonempty = {.a=1, .b=2, .c=3, .d=4};
  S1 const nonempty_with_expr = {.a=1, .b=42, .c=as_type<int>((as_type<uint>(42) + as_type<uint>(1))), .d=nonempty.d};
  S3 const nested_empty = {};
  S1 const tint_symbol_1 = {.a=2, .b=3, .c=4, .d=5};
  S1 const tint_symbol_2 = {.a=7, .b=8, .c=9, .d=10};
  S2 const tint_symbol_3 = {.e=6, .f=tint_symbol_2};
  S3 const nested_nonempty = {.g=1, .h=tint_symbol_1, .i=tint_symbol_3};
  S1 const tint_symbol_4 = {.a=2, .b=42, .c=as_type<int>((as_type<uint>(42) + as_type<uint>(1))), .d=nested_nonempty.i.f.d};
  S2 const tint_symbol_5 = {.e=6, .f=nonempty};
  S3 const nested_nonempty_with_expr = {.g=1, .h=tint_symbol_4, .i=tint_symbol_5};
  S1 const tint_symbol_6 = {};
  int const subexpr_empty = tint_symbol_6.a;
  S1 const tint_symbol_7 = {.a=1, .b=2, .c=3, .d=4};
  int const subexpr_nonempty = tint_symbol_7.b;
  S1 const tint_symbol_8 = {.a=1, .b=42, .c=as_type<int>((as_type<uint>(42) + as_type<uint>(1))), .d=nonempty.d};
  int const subexpr_nonempty_with_expr = tint_symbol_8.c;
  S2 const tint_symbol_9 = {};
  S1 const subexpr_nested_empty = tint_symbol_9.f;
  S1 const tint_symbol_10 = {.a=2, .b=3, .c=4, .d=5};
  S2 const tint_symbol_11 = {.e=1, .f=tint_symbol_10};
  S1 const subexpr_nested_nonempty = tint_symbol_11.f;
  S1 const tint_symbol_12 = {.a=2, .b=42, .c=as_type<int>((as_type<uint>(42) + as_type<uint>(1))), .d=nested_nonempty.i.f.d};
  S2 const tint_symbol_13 = {.e=1, .f=tint_symbol_12};
  S1 const subexpr_nested_nonempty_with_expr = tint_symbol_13.f;
  tint_array<T, 2> const aosoa_empty = tint_array<T, 2>{};
  tint_array<int, 2> const tint_symbol_14 = tint_array<int, 2>{1, 2};
  T const tint_symbol_15 = {.a=tint_symbol_14};
  tint_array<int, 2> const tint_symbol_16 = tint_array<int, 2>{3, 4};
  T const tint_symbol_17 = {.a=tint_symbol_16};
  tint_array<T, 2> const aosoa_nonempty = tint_array<T, 2>{tint_symbol_15, tint_symbol_17};
  tint_array<int, 2> const tint_symbol_18 = tint_array<int, 2>{1, as_type<int>((as_type<uint>(aosoa_nonempty[0].a[0]) + as_type<uint>(1)))};
  T const tint_symbol_19 = {.a=tint_symbol_18};
  tint_array<T, 2> const aosoa_nonempty_with_expr = tint_array<T, 2>{tint_symbol_19, aosoa_nonempty[1]};
  return;
}

