SKIP: FAILED

#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ packed_float2 resolution;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_2 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(constant buf0& x_7, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  float3 c = 0.0f;
  float x_51 = 0.0f;
  float x_55 = 0.0f;
  float x_56 = 0.0f;
  float x_81 = 0.0f;
  float x_82 = 0.0f;
  float x_118 = 0.0f;
  float x_119 = 0.0f;
  float x_55_phi = 0.0f;
  int x_58_phi = 0;
  float x_81_phi = 0.0f;
  float x_82_phi = 0.0f;
  bool x_83_phi = false;
  float x_85_phi = 0.0f;
  float x_122_phi = 0.0f;
  int x_129_phi = 0;
  c = float3(7.0f, 8.0f, 9.0f);
  float const x_47 = x_7.resolution.x;
  float const x_49 = rint((x_47 * 0.125f));
  x_51 = (*(tint_symbol_5)).x;
  switch(0u) {
    default: {
      x_55_phi = -0.5f;
      x_58_phi = 1;
      while (true) {
        float x_68 = 0.0f;
        float x_76 = 0.0f;
        int x_59 = 0;
        float x_56_phi = 0.0f;
        x_55 = x_55_phi;
        int const x_58 = x_58_phi;
        x_81_phi = 0.0f;
        x_82_phi = x_55;
        x_83_phi = false;
        if ((x_58 < 800)) {
        } else {
          break;
        }
        float x_75 = 0.0f;
        float x_76_phi = 0.0f;
        if (((x_58 % 32) == 0)) {
          x_68 = (x_55 + 0.400000006f);
          x_56_phi = x_68;
        } else {
          x_76_phi = x_55;
          if (((float(x_58) % rint(x_49)) <= 0.01f)) {
            x_75 = (x_55 + 100.0f);
            x_76_phi = x_75;
          }
          x_76 = x_76_phi;
          x_56_phi = x_76;
        }
        x_56 = x_56_phi;
        if ((float(x_58) >= x_51)) {
          x_81_phi = x_56;
          x_82_phi = x_56;
          x_83_phi = true;
          break;
        }
        {
          x_59 = (x_58 + 1);
          x_55_phi = x_56;
          x_58_phi = x_59;
        }
      }
      x_81 = x_81_phi;
      x_82 = x_82_phi;
      bool const x_83 = x_83_phi;
      x_85_phi = x_81;
      if (x_83) {
        break;
      }
      x_85_phi = x_82;
      break;
    }
  }
  float x_88 = 0.0f;
  float x_92 = 0.0f;
  float x_93 = 0.0f;
  float x_92_phi = 0.0f;
  int x_95_phi = 0;
  float x_118_phi = 0.0f;
  float x_119_phi = 0.0f;
  bool x_120_phi = false;
  float const x_85 = x_85_phi;
  c.x = x_85;
  x_88 = (*(tint_symbol_5)).y;
  switch(0u) {
    default: {
      x_92_phi = -0.5f;
      x_95_phi = 1;
      while (true) {
        float x_113 = 0.0f;
        float x_112 = 0.0f;
        int x_96 = 0;
        float x_93_phi = 0.0f;
        x_92 = x_92_phi;
        int const x_95 = x_95_phi;
        x_118_phi = 0.0f;
        x_119_phi = x_92;
        x_120_phi = false;
        if ((x_95 < 800)) {
        } else {
          break;
        }
        float x_111 = 0.0f;
        float x_112_phi = 0.0f;
        if (((x_95 % 32) == 0)) {
          x_113 = (x_92 + 0.400000006f);
          x_93_phi = x_113;
        } else {
          x_112_phi = x_92;
          if (((float(x_95) % rint(x_49)) <= 0.01f)) {
            x_111 = (x_92 + 100.0f);
            x_112_phi = x_111;
          }
          x_112 = x_112_phi;
          x_93_phi = x_112;
        }
        x_93 = x_93_phi;
        if ((float(x_95) >= x_88)) {
          x_118_phi = x_93;
          x_119_phi = x_93;
          x_120_phi = true;
          break;
        }
        {
          x_96 = (x_95 + 1);
          x_92_phi = x_93;
          x_95_phi = x_96;
        }
      }
      x_118 = x_118_phi;
      x_119 = x_119_phi;
      bool const x_120 = x_120_phi;
      x_122_phi = x_118;
      if (x_120) {
        break;
      }
      x_122_phi = x_119;
      break;
    }
  }
  float const x_122 = x_122_phi;
  c.y = x_122;
  float const x_124 = c.x;
  float const x_125 = c.y;
  c.z = (x_124 + x_125);
  x_129_phi = 0;
  while (true) {
    int x_130 = 0;
    int const x_129 = x_129_phi;
    if ((x_129 < 3)) {
    } else {
      break;
    }
    int const x_135_save = x_129;
    float const x_136 = c[x_135_save];
    if ((x_136 >= 1.0f)) {
      float const x_140 = c[x_135_save];
      float const x_141 = c[x_135_save];
      c[x_135_save] = (x_140 * x_141);
    }
    {
      x_130 = (x_129 + 1);
      x_129_phi = x_130;
    }
  }
  float3 const x_143 = c;
  float3 const x_145 = normalize(fabs(x_143));
  *(tint_symbol_6) = float4(x_145.x, x_145.y, x_145.z, 1.0f);
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
  thread float4 tint_symbol_7 = 0.0f;
  thread float4 tint_symbol_8 = 0.0f;
  tint_symbol_7 = gl_FragCoord_param;
  main_1(x_7, &(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;
}

T:\tmp\udmw.0.metal:60:29: error: invalid operands to binary expression ('float' and 'float')
          if (((float(x_58) % rint(x_49)) <= 0.01f)) {
                ~~~~~~~~~~~ ^ ~~~~~~~~~~
T:\tmp\udmw.0.metal:127:29: error: invalid operands to binary expression ('float' and 'float')
          if (((float(x_95) % rint(x_49)) <= 0.01f)) {
                ~~~~~~~~~~~ ^ ~~~~~~~~~~
2 errors generated.

