SKIP: FAILED

vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.wgsl:1:13 warning: use of deprecated language feature: the @stride attribute is deprecated; use a larger type if necessary
type Arr = @stride(16) array<f32, 3>;
            ^^^^^^

vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.wgsl:7:15 warning: use of deprecated language feature: the @stride attribute is deprecated; use a larger type if necessary
type Arr_1 = @stride(16) array<i32, 4>;
              ^^^^^^

vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.wgsl:17:15 warning: use of deprecated language feature: the @stride attribute is deprecated; use a larger type if necessary
type Arr_2 = @stride(16) array<u32, 1>;
              ^^^^^^

#version 310 es
precision mediump float;

vec4 tint_unpack4x8snorm(uint param_0) {
  int j = int(param_0);
  int4 i = int4(j << 24, j << 16, j << 8, j) >> 24;
  return clamp(float4(i) / 127.0, -1.0, 1.0);
}


struct tint_padded_array_element {
  float el;
};

struct buf1 {
  tint_padded_array_element x_GLF_uniform_float_values[3];
};

struct tint_padded_array_element_1 {
  int el;
};

struct buf2 {
  tint_padded_array_element_1 x_GLF_uniform_int_values[4];
};

struct buf3 {
  int three;
};

struct tint_padded_array_element_2 {
  uint el;
};

struct buf0 {
  tint_padded_array_element_2 x_GLF_uniform_uint_values[1];
};

vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
layout(binding = 1) uniform buf1_1 {
  tint_padded_array_element x_GLF_uniform_float_values[3];
} x_8;

vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
layout(binding = 2) uniform buf2_1 {
  tint_padded_array_element_1 x_GLF_uniform_int_values[4];
} x_12;

layout(binding = 3) uniform buf3_1 {
  int three;
} x_14;

layout(binding = 0) uniform buf0_1 {
  tint_padded_array_element_2 x_GLF_uniform_uint_values[1];
} x_16;

void func0_() {
  vec4 tmp = vec4(0.0f, 0.0f, 0.0f, 0.0f);
  float x_112 = tint_symbol.x;
  float x_114 = x_8.x_GLF_uniform_float_values[1].el;
  if ((x_112 > x_114)) {
    tmp = x_GLF_color;
  }
  x_GLF_color = tmp;
  return;
}

int func1_() {
  int a = 0;
  int x_122 = x_12.x_GLF_uniform_int_values[1].el;
  a = x_122;
  while (true) {
    int x_127 = a;
    int x_129 = x_12.x_GLF_uniform_int_values[3].el;
    if ((x_127 < x_129)) {
    } else {
      break;
    }
    int x_133 = x_14.three;
    int x_135 = x_12.x_GLF_uniform_int_values[1].el;
    if ((x_133 > x_135)) {
      func0_();
      int x_142 = x_12.x_GLF_uniform_int_values[3].el;
      a = x_142;
    } else {
      func0_();
    }
  }
  return a;
}

void main_1() {
  int a_1 = 0;
  int i = 0;
  int j = 0;
  float x_56 = tint_symbol.x;
  float x_58 = x_8.x_GLF_uniform_float_values[1].el;
  if ((x_56 > x_58)) {
    float x_64 = x_8.x_GLF_uniform_float_values[0].el;
    float x_66 = x_8.x_GLF_uniform_float_values[1].el;
    float x_68 = x_8.x_GLF_uniform_float_values[0].el;
    float x_70 = x_8.x_GLF_uniform_float_values[2].el;
    x_GLF_color = vec4(x_64, x_66, x_68, x_70);
  } else {
    uint x_73 = x_16.x_GLF_uniform_uint_values[0].el;
    x_GLF_color = tint_unpack4x8snorm(x_73);
  }
  int x_76 = x_12.x_GLF_uniform_int_values[2].el;
  a_1 = x_76;
  i = 0;
  {
    for(; (i < 5); i = (i + 1)) {
      j = 0;
      {
        for(; (j < 2); j = (j + 1)) {
          int x_91 = func1_();
          a_1 = (a_1 + x_91);
        }
      }
    }
  }
  int x_98 = a_1;
  int x_100 = x_12.x_GLF_uniform_int_values[0].el;
  if ((x_98 == x_100)) {
    float x_105 = x_8.x_GLF_uniform_float_values[0].el;
    float x_107 = x_GLF_color.z;
    x_GLF_color.z = (x_107 - x_105);
  }
  return;
}

struct main_out {
  vec4 x_GLF_color_1;
};

struct tint_symbol_4 {
  vec4 tint_symbol_2;
};

struct tint_symbol_5 {
  vec4 x_GLF_color_1;
};

main_out tint_symbol_1_inner(vec4 tint_symbol_2) {
  tint_symbol = tint_symbol_2;
  main_1();
  main_out tint_symbol_6 = main_out(x_GLF_color);
  return tint_symbol_6;
}

tint_symbol_5 tint_symbol_1(tint_symbol_4 tint_symbol_3) {
  main_out inner_result = tint_symbol_1_inner(tint_symbol_3.tint_symbol_2);
  tint_symbol_5 wrapper_result = tint_symbol_5(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_4 inputs;
  inputs.tint_symbol_2 = gl_FragCoord;
  tint_symbol_5 outputs;
  outputs = tint_symbol_1(inputs);
  x_GLF_color_1 = outputs.x_GLF_color_1;
}

Error parsing GLSL shader:
ERROR: 0:6: 'int4' : undeclared identifier 
ERROR: 0:6: '' : compilation terminated 
ERROR: 2 compilation errors.  No code generated.



