#include <metal_stdlib>

using namespace metal;
float3 bitcast_2b05b3() {
  float3 arg_0 = float3(1.0f);
  float3 res = as_type<float3>(arg_0);
  return res;
}

fragment void fragment_main(device packed_float3* tint_symbol_1 [[buffer(0)]]) {
  *(tint_symbol_1) = packed_float3(bitcast_2b05b3());
  return;
}

kernel void compute_main(device packed_float3* tint_symbol_2 [[buffer(0)]]) {
  *(tint_symbol_2) = packed_float3(bitcast_2b05b3());
  return;
}

struct VertexOutput {
  float4 pos;
  float3 prevent_dce;
};

struct tint_symbol {
  float3 prevent_dce [[user(locn0)]] [[flat]];
  float4 pos [[position]];
};

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

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

