#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_3) {
  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_3) = 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_3) = float4(1.0f, 0.0f, 0.0f, 1.0f);
      } else {
        *(tint_symbol_3) = float4(0.0f, 0.0f, 0.0f, 0.0f);
      }
    }
    x_44 = true;
    break;
  }
  return;
}

main_out tint_symbol_inner(constant buf0& x_10, thread float4* const tint_symbol_4) {
  main_1(x_10, tint_symbol_4);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_4)};
  return tint_symbol_2;
}

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

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)));
}

