struct tint_symbol {
  int value : SV_Target0;
};

int main0_inner() {
  return 1;
}

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

struct tint_symbol_1 {
  uint value : SV_Target1;
};

uint main1_inner() {
  return 1u;
}

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

struct tint_symbol_2 {
  float value : SV_Target2;
};

float main2_inner() {
  return 1.0f;
}

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

struct tint_symbol_3 {
  float4 value : SV_Target3;
};

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

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

struct tint_symbol_4 {
  float16_t value : SV_Target4;
};

float16_t main4_inner() {
  return float16_t(2.25h);
}

tint_symbol_4 main4() {
  const float16_t inner_result_4 = main4_inner();
  tint_symbol_4 wrapper_result_4 = (tint_symbol_4)0;
  wrapper_result_4.value = inner_result_4;
  return wrapper_result_4;
}

struct tint_symbol_5 {
  vector<float16_t, 3> value : SV_Target5;
};

vector<float16_t, 3> main5_inner() {
  return vector<float16_t, 3>(float16_t(3.0h), float16_t(5.0h), float16_t(8.0h));
}

tint_symbol_5 main5() {
  const vector<float16_t, 3> inner_result_5 = main5_inner();
  tint_symbol_5 wrapper_result_5 = (tint_symbol_5)0;
  wrapper_result_5.value = inner_result_5;
  return wrapper_result_5;
}
