SKIP: FAILED

#version 310 es
precision mediump float;

struct tint_padded_array_element {
  int el;
};

struct buf0 {
  tint_padded_array_element x_GLF_uniform_int_values[6];
};

layout(binding = 0) uniform buf0_1 {
  tint_padded_array_element x_GLF_uniform_int_values[6];
} x_6;

vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
void main_1() {
  int arr[3] = int[3](0, 0, 0);
  int index = 0;
  bool x_76 = false;
  bool x_86 = false;
  bool x_77_phi = false;
  bool x_87_phi = false;
  int x_33 = x_6.x_GLF_uniform_int_values[3].el;
  int x_35 = x_6.x_GLF_uniform_int_values[5].el;
  int x_37 = x_6.x_GLF_uniform_int_values[2].el;
  int tint_symbol_2[3] = int[3](x_33, x_35, x_37);
  arr = tint_symbol_2;
  index = 1;
  while (true) {
    bool x_51 = false;
    bool x_52_phi = false;
    x_52_phi = true;
    if (true) {
      int x_46 = x_6.x_GLF_uniform_int_values[0].el;
      x_51 = !(((x_46 == 1) & (index <= 1)));
      x_52_phi = x_51;
    }
    if (!(x_52_phi)) {
    } else {
      break;
    }
    int x_56_save = index;
    int x_57 = arr[x_56_save];
    arr[x_56_save] = (x_57 + 1);
    index = (index + 1);
  }
  int x_62 = x_6.x_GLF_uniform_int_values[1].el;
  int x_64 = arr[x_62];
  int x_66 = x_6.x_GLF_uniform_int_values[3].el;
  bool x_67 = (x_64 == x_66);
  x_77_phi = x_67;
  if (x_67) {
    int x_71 = x_6.x_GLF_uniform_int_values[0].el;
    int x_73 = arr[x_71];
    int x_75 = x_6.x_GLF_uniform_int_values[4].el;
    x_76 = (x_73 == x_75);
    x_77_phi = x_76;
  }
  bool x_77 = x_77_phi;
  x_87_phi = x_77;
  if (x_77) {
    int x_81 = x_6.x_GLF_uniform_int_values[3].el;
    int x_83 = arr[x_81];
    int x_85 = x_6.x_GLF_uniform_int_values[2].el;
    x_86 = (x_83 == x_85);
    x_87_phi = x_86;
  }
  if (x_87_phi) {
    int x_92 = x_6.x_GLF_uniform_int_values[0].el;
    int x_95 = x_6.x_GLF_uniform_int_values[1].el;
    int x_98 = x_6.x_GLF_uniform_int_values[1].el;
    int x_101 = x_6.x_GLF_uniform_int_values[0].el;
    x_GLF_color = vec4(float(x_92), float(x_95), float(x_98), float(x_101));
  } else {
    int x_105 = x_6.x_GLF_uniform_int_values[1].el;
    float x_106 = float(x_105);
    x_GLF_color = vec4(x_106, x_106, x_106, x_106);
  }
  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_3 = main_out(x_GLF_color);
  return tint_symbol_3;
}

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:36: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
ERROR: 0:36: '' : compilation terminated 
ERROR: 2 compilation errors.  No code generated.



