#include <metal_stdlib>

using namespace metal;
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 tint_array_wrapper {
  int arr[2];
};

struct T {
  tint_array_wrapper a;
};

struct tint_array_wrapper_1 {
  T arr[2];
};

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=x, .c=as_type<int>((as_type<uint>(x) + 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=x, .c=as_type<int>((as_type<uint>(x) + 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=x, .c=as_type<int>((as_type<uint>(x) + 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=x, .c=as_type<int>((as_type<uint>(x) + 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_wrapper_1 const aosoa_empty = {.arr={}};
  tint_array_wrapper const tint_symbol_14 = {.arr={1, 2}};
  T const tint_symbol_15 = {.a=tint_symbol_14};
  tint_array_wrapper const tint_symbol_16 = {.arr={3, 4}};
  T const tint_symbol_17 = {.a=tint_symbol_16};
  tint_array_wrapper_1 const aosoa_nonempty = {.arr={tint_symbol_15, tint_symbol_17}};
  tint_array_wrapper const tint_symbol_18 = {.arr={1, as_type<int>((as_type<uint>(aosoa_nonempty.arr[0].a.arr[0]) + as_type<uint>(1)))}};
  T const tint_symbol_19 = {.a=tint_symbol_18};
  tint_array_wrapper_1 const aosoa_nonempty_with_expr = {.arr={tint_symbol_19, aosoa_nonempty.arr[1]}};
  return;
}

