#include <metal_stdlib>

using namespace metal;

struct modf_result_vec2_f16 {
  half2 fract;
  half2 whole;
};
modf_result_vec2_f16 tint_modf(half2 param_0) {
  modf_result_vec2_f16 result;
  result.fract = modf(param_0, result.whole);
  return result;
}

void modf_a545b9() {
  half2 arg_0 = half2(-1.5h);
  modf_result_vec2_f16 res = tint_modf(arg_0);
}

fragment void fragment_main() {
  modf_a545b9();
  return;
}

kernel void compute_main() {
  modf_a545b9();
  return;
}

struct VertexOutput {
  float4 pos;
};

struct tint_symbol {
  float4 pos [[position]];
};

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

vertex tint_symbol vertex_main() {
  VertexOutput const inner_result = vertex_main_inner();
  tint_symbol wrapper_result = {};
  wrapper_result.pos = inner_result.pos;
  return wrapper_result;
}

