SKIP: FAILED

vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/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<i32, 3>;
            ^^^^^^

#version 310 es
precision mediump float;

vec4 tint_unpack4x8unorm(uint param_0) {
  uint j = param_0;
  uint4 i = uint4(j & 0xff, (j >> 8) & 0xff, (j >> 16) & 0xff, j >> 24);
  return float4(i) / 255.0;
}


struct tint_padded_array_element {
  int el;
};
struct buf0 {
  tint_padded_array_element x_GLF_uniform_int_values[3];
};

layout(binding = 0) uniform buf0_1 {
  tint_padded_array_element x_GLF_uniform_int_values[3];
} x_6;
vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);

void main_1() {
  int i = 0;
  vec4 v = vec4(0.0f, 0.0f, 0.0f, 0.0f);
  int x_30 = x_6.x_GLF_uniform_int_values[1].el;
  i = x_30;
  while (true) {
    int x_35 = i;
    int x_37 = x_6.x_GLF_uniform_int_values[2].el;
    if ((x_35 < x_37)) {
    } else {
      break;
    }
    v = tint_unpack4x8unorm(100u);
    float x_42 = v.x;
    if ((int(x_42) > i)) {
      int x_49 = x_6.x_GLF_uniform_int_values[1].el;
      float x_50 = float(x_49);
      x_GLF_color = vec4(x_50, x_50, x_50, x_50);
      return;
    }
    {
      i = (i + 1);
    }
  }
  int x_55 = x_6.x_GLF_uniform_int_values[0].el;
  int x_58 = x_6.x_GLF_uniform_int_values[1].el;
  int x_61 = x_6.x_GLF_uniform_int_values[1].el;
  int x_64 = x_6.x_GLF_uniform_int_values[0].el;
  x_GLF_color = vec4(float(x_55), float(x_58), float(x_61), float(x_64));
  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:6: 'uint4' : undeclared identifier 
ERROR: 0:6: '' : compilation terminated 
ERROR: 2 compilation errors.  No code generated.



