#include <metal_stdlib>
using namespace metal;

struct modf_result_f16 {
  half fract;
  half whole;
};

struct VertexOutput {
  float4 pos;
};

struct vertex_main_outputs {
  float4 VertexOutput_pos [[position]];
};

void modf_8dbbbf() {
  modf_result_f16 res = modf_result_f16{.fract=-0.5h, .whole=-1.0h};
}

fragment void fragment_main() {
  modf_8dbbbf();
}

kernel void compute_main() {
  modf_8dbbbf();
}

VertexOutput vertex_main_inner() {
  VertexOutput out = {};
  out.pos = float4(0.0f);
  modf_8dbbbf();
  return out;
}

vertex vertex_main_outputs vertex_main() {
  return vertex_main_outputs{.VertexOutput_pos=vertex_main_inner().pos};
}
