#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 = (2 + 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 = (x_72 + 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 = (x_77 + 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 = ((x_89.a + x_91.b) + 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 = (x_109 + 1);
  int const x_112 = *(x);
  (*(s)).c = (x_112 + 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 ((x_119 + x_120) + x_122);
}

