#include <metal_stdlib>

using namespace metal;
struct S {
  int a;
  int b;
  int c;
};
struct buf0 {
  /* 0x0000 */ int one;
};
struct tint_array_wrapper {
  S arr[2];
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(constant buf0& x_10, thread float4* const tint_symbol_4) {
  int x_43 = 0;
  bool x_44 = false;
  tint_array_wrapper arr = {};
  S param = {};
  int param_1 = 0;
  while (true) {
    int x_50 = 0;
    x_50 = x_10.one;
    arr.arr[x_50].a = 2;
    int const x_53 = arr.arr[1].a;
    if ((x_53 < 1)) {
      *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
      x_44 = true;
      break;
    } else {
      S const x_60 = arr.arr[1];
      param = x_60;
      param_1 = as_type<int>((as_type<uint>(2) + as_type<uint>(as_type<int>(x_50))));
      int const x_61 = param_1;
      S const x_63 = param;
      S x_64_1 = x_63;
      x_64_1.a = x_61;
      S const x_64 = x_64_1;
      param = x_64;
      S const x_65 = param;
      if ((x_65.a == 2)) {
        S const x_70 = param;
        S x_71_1 = x_70;
        x_71_1.a = 9;
        S const x_71 = x_71_1;
        param = x_71;
      }
      int const x_72 = param_1;
      S const x_75 = param;
      S x_76_1 = x_75;
      x_76_1.b = as_type<int>((as_type<uint>(x_72) + as_type<uint>(1)));
      S const x_76 = x_76_1;
      param = x_76;
      int const x_77 = param_1;
      S const x_80 = param;
      S x_81_1 = x_80;
      x_81_1.c = as_type<int>((as_type<uint>(x_77) + as_type<uint>(2)));
      S const x_81 = x_81_1;
      param = x_81;
      S const x_82 = param;
      if ((x_82.b == 2)) {
        S const x_87 = param;
        S x_88_1 = x_87;
        x_88_1.b = 7;
        S const x_88 = x_88_1;
        param = x_88;
      }
      S const x_89 = param;
      S const x_91 = param;
      S const x_94 = param;
      x_43 = as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(x_89.a) + as_type<uint>(x_91.b)))) + as_type<uint>(x_94.c)));
      int const x_97 = x_43;
      if ((x_97 == 12)) {
        *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
      } else {
        *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
      }
    }
    x_44 = true;
    break;
  }
  return;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_10 [[buffer(0)]]) {
  thread float4 tint_symbol_5 = 0.0f;
  main_1(x_10, &(tint_symbol_5));
  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
  return tint_symbol_3;
}

int func_struct_S_i1_i1_i11_i1_(thread S* const s, thread int* const x) {
  int const x_103 = *(x);
  (*(s)).a = x_103;
  int const x_105 = (*(s)).a;
  if ((x_105 == 2)) {
    (*(s)).a = 9;
  }
  int const x_109 = *(x);
  (*(s)).b = as_type<int>((as_type<uint>(x_109) + as_type<uint>(1)));
  int const x_112 = *(x);
  (*(s)).c = as_type<int>((as_type<uint>(x_112) + as_type<uint>(2)));
  int const x_115 = (*(s)).b;
  if ((x_115 == 2)) {
    (*(s)).b = 7;
  }
  int const x_119 = (*(s)).a;
  int const x_120 = (*(s)).b;
  int const x_122 = (*(s)).c;
  return as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(x_119) + as_type<uint>(x_120)))) + as_type<uint>(x_122)));
}

