#include <metal_stdlib>

using namespace metal;
struct tint_symbol {
  int value [[color(0)]];
};

int main0_inner() {
  return 1;
}

fragment tint_symbol main0() {
  int const inner_result = main0_inner();
  tint_symbol wrapper_result = {};
  wrapper_result.value = inner_result;
  return wrapper_result;
}

struct tint_symbol_1 {
  uint value [[color(1)]];
};

uint main1_inner() {
  return 1u;
}

fragment tint_symbol_1 main1() {
  uint const inner_result_1 = main1_inner();
  tint_symbol_1 wrapper_result_1 = {};
  wrapper_result_1.value = inner_result_1;
  return wrapper_result_1;
}

struct tint_symbol_2 {
  float value [[color(2)]];
};

float main2_inner() {
  return 1.0f;
}

fragment tint_symbol_2 main2() {
  float const inner_result_2 = main2_inner();
  tint_symbol_2 wrapper_result_2 = {};
  wrapper_result_2.value = inner_result_2;
  return wrapper_result_2;
}

struct tint_symbol_3 {
  float4 value [[color(3)]];
};

float4 main3_inner() {
  return float4(1.0f, 2.0f, 3.0f, 4.0f);
}

fragment tint_symbol_3 main3() {
  float4 const inner_result_3 = main3_inner();
  tint_symbol_3 wrapper_result_3 = {};
  wrapper_result_3.value = inner_result_3;
  return wrapper_result_3;
}

