SKIP: FAILED

vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.wgsl:39:22 warning: use of deprecated intrinsic
  let x_48 : bool = (isInf(x_44) || (x_46 == 1.0));
                     ^^^^^

#version 310 es
precision mediump float;

struct tint_padded_array_element {
  int el;
};
struct buf1 {
  tint_padded_array_element x_GLF_uniform_int_values[2];
};
struct tint_padded_array_element_1 {
  float el;
};
struct buf0 {
  tint_padded_array_element_1 x_GLF_uniform_float_values[1];
};

vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
layout (binding = 1) uniform buf1_1 {
  tint_padded_array_element x_GLF_uniform_int_values[2];
} x_8;

void main_1() {
  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;
  if ((s1 == 0.0f)) {
    s1 = 1.0f;
  }
  bool x_62 = false;
  bool x_71 = false;
  bool x_63_phi = false;
  bool x_72_phi = false;
  f1 = (10.0f % s1);
  bool tint_tmp = isinf(f1);
  if (!tint_tmp) {
    tint_tmp = (s1 == 1.0f);
  }
  bool x_48 = (tint_tmp);
  x_73_phi = x_48;
  if (!(x_48)) {
    bool x_54 = (f0 == f1);
    x_63_phi = x_54;
    if (!(x_54)) {
      bool tint_tmp_1 = (f0 > 0.99000001f);
      if (tint_tmp_1) {
        tint_tmp_1 = (f0 < 0.01f);
      }
      x_62 = (tint_tmp_1);
      x_63_phi = x_62;
    }
    bool x_63 = x_63_phi;
    x_72_phi = x_63;
    if (!(x_63)) {
      bool tint_tmp_2 = (f1 > 0.99000001f);
      if (tint_tmp_2) {
        tint_tmp_2 = (f1 < 0.01f);
      }
      x_71 = (tint_tmp_2);
      x_72_phi = x_71;
    }
    x_72 = x_72_phi;
    x_73_phi = x_72;
  }
  bool tint_tmp_3 = x_73_phi;
  if (!tint_tmp_3) {
    tint_tmp_3 = (f1 == 10.0f);
  }
  if ((tint_tmp_3)) {
    int x_81 = x_8.x_GLF_uniform_int_values[1].el;
    int x_84 = x_8.x_GLF_uniform_int_values[0].el;
    int x_87 = x_8.x_GLF_uniform_int_values[0].el;
    int x_90 = x_8.x_GLF_uniform_int_values[1].el;
    x_GLF_color = vec4(float(x_81), float(x_84), float(x_87), float(x_90));
  } else {
    int x_94 = x_8.x_GLF_uniform_int_values[0].el;
    float x_95 = float(x_94);
    x_GLF_color = vec4(x_95, x_95, x_95, x_95);
  }
  return;
}

struct main_out {
  vec4 x_GLF_color_1;
};
struct tint_symbol_1 {
  vec4 x_GLF_color_1;
};

main_out tint_symbol_inner() {
  main_1();
  main_out tint_symbol_2 = main_out(x_GLF_color);
  return tint_symbol_2;
}

tint_symbol_1 tint_symbol() {
  main_out inner_result = tint_symbol_inner();
  tint_symbol_1 wrapper_result = tint_symbol_1(vec4(0.0f, 0.0f, 0.0f, 0.0f));
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}
out vec4 x_GLF_color_1;
void main() {
  tint_symbol_1 outputs;
  outputs = tint_symbol();
  x_GLF_color_1 = outputs.x_GLF_color_1;
}


Error parsing GLSL shader:
ERROR: 0:28: '%' :  wrong operand types: no operation '%' exists that takes a left-hand operand of type ' const float' and a right operand of type ' const float' (or there is no acceptable conversion)
ERROR: 0:28: '' : compilation terminated 
ERROR: 2 compilation errors.  No code generated.



