#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 = (x_30 + 1);
            x_30_phi = x_31;
          }
          continue;
        }
        {
          x_31 = (x_30 + 1);
          x_30_phi = x_31;
        }
        continue;
      }
      x_47();
      x_48_phi = true;
      break;
      {
        x_31 = (x_30 + 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;
}

