#include <metal_stdlib>
using namespace metal;
struct tint_module_vars_struct {
  device half* prevent_dce;
};
struct VertexOutput {
  float4 pos;
  half prevent_dce;
};
struct vertex_main_outputs {
  float4 VertexOutput_pos [[position]];
  half VertexOutput_prevent_dce [[user(locn0)]] [[flat]];
};

half distance_928fa0() {
  half3 arg_0 = half3(1.0h);
  half3 arg_1 = half3(1.0h);
  half res = distance(arg_0, arg_1);
  return res;
}
fragment void fragment_main(device half* prevent_dce [[buffer(0)]]) {
  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
  (*tint_module_vars.prevent_dce) = distance_928fa0();
}
kernel void compute_main(device half* prevent_dce [[buffer(0)]]) {
  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
  (*tint_module_vars.prevent_dce) = distance_928fa0();
}
VertexOutput vertex_main_inner() {
  VertexOutput out = {};
  out.pos = float4(0.0f);
  out.prevent_dce = distance_928fa0();
  return out;
}
vertex vertex_main_outputs vertex_main() {
  VertexOutput const v = vertex_main_inner();
  return vertex_main_outputs{.VertexOutput_pos=v.pos, .VertexOutput_prevent_dce=v.prevent_dce};
}
