#include <metal_stdlib>

using namespace metal;
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_2 {
  float4 x_GLF_color_1 [[color(0)]];
};

void x_47() {
  discard_fragment();
}

void main_1(thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  while (true) {
    int x_30_phi = 0;
    bool x_48_phi = false;
    x_30_phi = 0;
    while (true) {
      int x_31 = 0;
      int const x_30 = x_30_phi;
      x_48_phi = false;
      if ((x_30 < 10)) {
      } else {
        break;
      }
      float const x_37 = (*(tint_symbol_5)).y;
      if ((x_37 < 0.0f)) {
        float const x_42 = (*(tint_symbol_5)).x;
        if ((x_42 < 0.0f)) {
          x_48_phi = false;
          break;
        } else {
          {
            x_31 = as_type<int>((as_type<uint>(x_30) + as_type<uint>(1)));
            x_30_phi = x_31;
          }
          continue;
        }
        {
          x_31 = as_type<int>((as_type<uint>(x_30) + as_type<uint>(1)));
          x_30_phi = x_31;
        }
        continue;
      }
      x_47();
      x_48_phi = true;
      break;
      {
        x_31 = as_type<int>((as_type<uint>(x_30) + as_type<uint>(1)));
        x_30_phi = x_31;
      }
    }
    bool const x_48 = x_48_phi;
    if (x_48) {
      break;
    }
    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
    break;
  }
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
  thread float4 tint_symbol_7 = 0.0f;
  thread float4 tint_symbol_8 = 0.0f;
  tint_symbol_7 = gl_FragCoord_param;
  main_1(&(tint_symbol_7), &(tint_symbol_8));
  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
  return tint_symbol_4;
}

