#include <metal_stdlib>

using namespace metal;
void uses_a(thread int* const tint_symbol) {
  *(tint_symbol) = as_type<int>((as_type<uint>(*(tint_symbol)) + as_type<uint>(1)));
}

void uses_b(thread int* const tint_symbol_1) {
  *(tint_symbol_1) = as_type<int>((as_type<uint>(*(tint_symbol_1)) * as_type<uint>(2)));
}

void uses_a_and_b(thread int* const tint_symbol_2, thread int* const tint_symbol_3) {
  *(tint_symbol_2) = *(tint_symbol_3);
}

void no_uses() {
}

void outer(thread int* const tint_symbol_4, thread int* const tint_symbol_5) {
  *(tint_symbol_4) = 0;
  uses_a(tint_symbol_4);
  uses_a_and_b(tint_symbol_5, tint_symbol_4);
  uses_b(tint_symbol_5);
  no_uses();
}

kernel void main1() {
  thread int tint_symbol_6 = 0;
  tint_symbol_6 = 42;
  uses_a(&(tint_symbol_6));
  return;
}

kernel void main2() {
  thread int tint_symbol_7 = 0;
  tint_symbol_7 = 7;
  uses_b(&(tint_symbol_7));
  return;
}

kernel void main3() {
  thread int tint_symbol_8 = 0;
  thread int tint_symbol_9 = 0;
  outer(&(tint_symbol_8), &(tint_symbol_9));
  no_uses();
  return;
}

kernel void main4() {
  no_uses();
  return;
}

