SKIP: FAILED

#version 310 es
precision mediump float;

struct frexp_result_vec2 {
  vec2 sig;
  ivec2 exp;
};
frexp_result_vec2 tint_frexp(vec2 param_0) {
  float2 exp;
  float2 sig = frexp(param_0, exp);
  frexp_result_vec2 result = {sig, int2(exp)};
  return result;
}


void frexp_4bdfc7() {
  frexp_result_vec2 res = tint_frexp(vec2(0.0f, 0.0f));
}

struct tint_symbol {
  vec4 value;
};

vec4 vertex_main_inner() {
  frexp_4bdfc7();
  return vec4(0.0f, 0.0f, 0.0f, 0.0f);
}

tint_symbol vertex_main() {
  vec4 inner_result = vertex_main_inner();
  tint_symbol wrapper_result = tint_symbol(vec4(0.0f, 0.0f, 0.0f, 0.0f));
  wrapper_result.value = inner_result;
  return wrapper_result;
}
void main() {
  tint_symbol outputs;
  outputs = vertex_main();
  gl_Position = outputs.value;
  gl_Position.y = -gl_Position.y;
}


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



#version 310 es
precision mediump float;

struct frexp_result_vec2 {
  vec2 sig;
  ivec2 exp;
};
frexp_result_vec2 tint_frexp(vec2 param_0) {
  float2 exp;
  float2 sig = frexp(param_0, exp);
  frexp_result_vec2 result = {sig, int2(exp)};
  return result;
}


void frexp_4bdfc7() {
  frexp_result_vec2 res = tint_frexp(vec2(0.0f, 0.0f));
}

struct tint_symbol {
  vec4 value;
};

void fragment_main() {
  frexp_4bdfc7();
  return;
}
void main() {
  fragment_main();
}


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



#version 310 es
precision mediump float;

struct frexp_result_vec2 {
  vec2 sig;
  ivec2 exp;
};
frexp_result_vec2 tint_frexp(vec2 param_0) {
  float2 exp;
  float2 sig = frexp(param_0, exp);
  frexp_result_vec2 result = {sig, int2(exp)};
  return result;
}


void frexp_4bdfc7() {
  frexp_result_vec2 res = tint_frexp(vec2(0.0f, 0.0f));
}

struct tint_symbol {
  vec4 value;
};

layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
void compute_main() {
  frexp_4bdfc7();
  return;
}
void main() {
  compute_main();
}


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



