#include <metal_stdlib>

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

float f_() {
  int i = 0;
  i = 1;
  while (true) {
    int const x_8 = i;
    if ((x_8 < 10)) {
    } else {
      break;
    }
    int const x_9 = i;
    if ((float(x_9) >= 1.0f)) {
      return 1.0f;
    } else {
      {
        int const x_10 = i;
        i = as_type<int>((as_type<uint>(x_10) + as_type<uint>(1)));
      }
      continue;
    }
    {
      int const x_10 = i;
      i = as_type<int>((as_type<uint>(x_10) + as_type<uint>(1)));
    }
  }
  return 1.0f;
}

void main_1(thread float4* const tint_symbol_3) {
  float4 c = 0.0f;
  int i_1 = 0;
  c = float4(1.0f, 0.0f, 0.0f, 1.0f);
  i_1 = 0;
  while (true) {
    int const x_12 = i_1;
    if ((x_12 < 1)) {
    } else {
      break;
    }
    {
      float const x_39 = f_();
      c.x = x_39;
      int const x_13 = i_1;
      i_1 = as_type<int>((as_type<uint>(x_13) + as_type<uint>(1)));
    }
  }
  float4 const x_41 = c;
  *(tint_symbol_3) = x_41;
  return;
}

main_out tint_symbol_inner(thread float4* const tint_symbol_4) {
  main_1(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() {
  thread float4 tint_symbol_5 = 0.0f;
  main_out const inner_result = tint_symbol_inner(&(tint_symbol_5));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

