#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ float zero;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

int merge_(constant buf0& x_6) {
  float const x_40 = x_6.zero;
  if ((x_40 < 0.0f)) {
    return 0;
  }
  return 0;
}

void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
  int res = 0;
  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  while (true) {
    float const x_32 = x_6.zero;
    switch(int(x_32)) {
      case 0: {
        return;
        break;
      }
      default: {
        break;
      }
    }
    {
      if (false) {
      } else {
        break;
      }
    }
  }
  int const x_8 = merge_(x_6);
  res = x_8;
  int const x_9 = res;
  float const x_36 = float(x_9);
  *(tint_symbol_4) = float4(x_36, x_36, x_36, x_36);
  return;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
  thread float4 tint_symbol_5 = 0.0f;
  main_1(x_6, &(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;
}

