SKIP: FAILED

#include <metal_stdlib>

using namespace metal;
struct tint_padded_array_element {
  /* 0x0000 */ int el;
  /* 0x0004 */ int8_t tint_pad[12];
};
struct tint_array_wrapper {
  /* 0x0000 */ tint_padded_array_element arr[2];
};
struct buf1 {
  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
};
struct tint_padded_array_element_1 {
  /* 0x0000 */ float el;
  /* 0x0004 */ int8_t tint_pad_1[12];
};
struct tint_array_wrapper_1 {
  /* 0x0000 */ tint_padded_array_element_1 arr[1];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(constant buf1& x_8, thread float4* const tint_symbol_4) {
  float f0 = 0.0f;
  float s1 = 0.0f;
  float f1 = 0.0f;
  bool x_72 = false;
  bool x_73_phi = false;
  f0 = (10.0f % 0.000001f);
  s1 = 9.99999935e-39f;
  float const x_38 = s1;
  if ((x_38 == 0.0f)) {
    s1 = 1.0f;
  }
  bool x_62 = false;
  bool x_71 = false;
  bool x_63_phi = false;
  bool x_72_phi = false;
  float const x_42 = s1;
  f1 = (10.0f % x_42);
  float const x_44 = f1;
  float const x_46 = s1;
  bool const x_48 = (isinf(x_44) || (x_46 == 1.0f));
  x_73_phi = x_48;
  if (!(x_48)) {
    float const x_52 = f0;
    float const x_53 = f1;
    bool const x_54 = (x_52 == x_53);
    x_63_phi = x_54;
    if (!(x_54)) {
      float const x_58 = f0;
      float const x_60 = f0;
      x_62 = ((x_58 > 0.99000001f) && (x_60 < 0.01f));
      x_63_phi = x_62;
    }
    bool const x_63 = x_63_phi;
    x_72_phi = x_63;
    if (!(x_63)) {
      float const x_67 = f1;
      float const x_69 = f1;
      x_71 = ((x_67 > 0.99000001f) && (x_69 < 0.01f));
      x_72_phi = x_71;
    }
    x_72 = x_72_phi;
    x_73_phi = x_72;
  }
  bool const x_73 = x_73_phi;
  float const x_74 = f1;
  if ((x_73 || (x_74 == 10.0f))) {
    int const x_81 = x_8.x_GLF_uniform_int_values.arr[1].el;
    int const x_84 = x_8.x_GLF_uniform_int_values.arr[0].el;
    int const x_87 = x_8.x_GLF_uniform_int_values.arr[0].el;
    int const x_90 = x_8.x_GLF_uniform_int_values.arr[1].el;
    *(tint_symbol_4) = float4(float(x_81), float(x_84), float(x_87), float(x_90));
  } else {
    int const x_94 = x_8.x_GLF_uniform_int_values.arr[0].el;
    float const x_95 = float(x_94);
    *(tint_symbol_4) = float4(x_95, x_95, x_95, x_95);
  }
  return;
}

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

T:\tmp\u3v4.0.metal:37:15: error: invalid operands to binary expression ('float' and 'float')
  f0 = (10.0f % 0.000001f);
        ~~~~~ ^ ~~~~~~~~~
T:\tmp\u3v4.0.metal:48:15: error: invalid operands to binary expression ('float' and 'const float')
  f1 = (10.0f % x_42);
        ~~~~~ ^ ~~~~
2 errors generated.

