SKIP: FAILED

#version 310 es
precision mediump float;

struct tint_padded_array_element {
  int el;
};

struct buf1 {
  tint_padded_array_element x_GLF_uniform_int_values[3];
};

struct tint_padded_array_element_1 {
  float el;
};

struct buf0 {
  tint_padded_array_element_1 x_GLF_uniform_float_values[2];
};

layout(binding = 1) uniform buf1_1 {
  tint_padded_array_element x_GLF_uniform_int_values[3];
} x_6;

layout(binding = 0) uniform buf0_1 {
  tint_padded_array_element_1 x_GLF_uniform_float_values[2];
} x_10;

vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
void main_1() {
  int A[2] = int[2](0, 0);
  int i = 0;
  int a = 0;
  vec2 v1 = vec2(0.0f, 0.0f);
  vec2 v2 = vec2(0.0f, 0.0f);
  int b = 0;
  int x_46 = x_6.x_GLF_uniform_int_values[2].el;
  int x_48 = x_6.x_GLF_uniform_int_values[0].el;
  A[x_46] = x_48;
  int x_51 = x_6.x_GLF_uniform_int_values[0].el;
  int x_53 = x_6.x_GLF_uniform_int_values[1].el;
  A[x_51] = x_53;
  int x_56 = x_6.x_GLF_uniform_int_values[0].el;
  i = x_56;
  while (true) {
    int x_61 = i;
    int x_63 = x_6.x_GLF_uniform_int_values[2].el;
    if ((x_61 > x_63)) {
    } else {
      break;
    }
    i = (i - 1);
  }
  float x_69 = x_10.x_GLF_uniform_float_values[1].el;
  float x_71 = x_10.x_GLF_uniform_float_values[1].el;
  int x_76 = A[((x_69 >= x_71) ? 1 : i)];
  a = x_76;
  int x_78 = x_6.x_GLF_uniform_int_values[0].el;
  int x_80 = a;
  int x_84 = x_6.x_GLF_uniform_int_values[0].el;
  int x_87 = x_6.x_GLF_uniform_int_values[0].el;
  float x_91 = x_10.x_GLF_uniform_float_values[1].el;
  float x_93 = x_10.x_GLF_uniform_float_values[0].el;
  v1 = (bvec2((x_91 < x_93), true) ? vec2(float(x_84), float(x_87)) : vec2(float(x_78), float(x_80)));
  int x_98 = x_6.x_GLF_uniform_int_values[2].el;
  float x_100 = v1[x_98];
  int x_103 = x_6.x_GLF_uniform_int_values[0].el;
  float x_105 = v1[x_103];
  v2 = (bvec2(false, false) ? vec2(x_105, x_105) : vec2(x_100, x_100));
  int x_109 = x_6.x_GLF_uniform_int_values[1].el;
  float x_110 = float(x_109);
  int x_113 = x_6.x_GLF_uniform_int_values[0].el;
  float x_114 = float(x_113);
  int x_121 = A[int(clamp(vec2(x_110, x_110), vec2(x_114, x_114), v2).x)];
  b = x_121;
  int x_122 = b;
  int x_124 = x_6.x_GLF_uniform_int_values[1].el;
  if ((x_122 == x_124)) {
    int x_130 = x_6.x_GLF_uniform_int_values[0].el;
    int x_133 = x_6.x_GLF_uniform_int_values[2].el;
    int x_136 = x_6.x_GLF_uniform_int_values[2].el;
    int x_139 = x_6.x_GLF_uniform_int_values[0].el;
    x_GLF_color = vec4(float(x_130), float(x_133), float(x_136), float(x_139));
  } else {
    int x_143 = x_6.x_GLF_uniform_int_values[2].el;
    float x_144 = float(x_143);
    x_GLF_color = vec4(x_144, x_144, x_144, x_144);
  }
  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;
}
layout(location = 0) 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:63: '' : boolean expression expected 
ERROR: 0:63: '' : compilation terminated 
ERROR: 2 compilation errors.  No code generated.



