#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=(x + 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=(x + 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=(x + 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=(x + 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, (aosoa_nonempty.arr[0].a.arr[0] + 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;
}

