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

float3 log_f4c570() {
  float3 arg_0 = float3(1.0f);
  float3 res = log(arg_0);
  return res;
}
fragment void fragment_main(device float3* 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) = log_f4c570();
}
kernel void compute_main(device float3* 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) = log_f4c570();
}
VertexOutput vertex_main_inner() {
  VertexOutput out = {};
  out.pos = float4(0.0f);
  out.prevent_dce = log_f4c570();
  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};
}
