void *alloc(int count, int size) {}
void print_int(int i);

//  What about structs and arrays?

struct foo {int a; int b; int c;};

void func(int n) {
  int *array;
  struct foo foo;
  int i, x;
  array = alloc(10, 4);
  // The array doesn't escape this function

  foo.a = 4;
  x = 0;

  for (i = 0; i < 10000000; i+=1) {
    foo.b = foo.a;
    foo.a = 1 + 2*foo.a;
    foo.b += foo.a;
    foo.b %= 5;

    // Variable but consistent address and
    // constant value
    array[n % 10] = foo.b;
    // Constant address, changing value
    array[(foo.a / foo.a)] += 2;

    // This condition is constant
    if (foo.b > 5) {
        x += 1;
    } else {
        x += 2;
    }
  } 

  print_int(foo.a);
  print_int(array[n % 10]);
  print_int(array[1]);
  print_int(foo.b);
  print_int(n);
}

void main(void) {
  func(1);
  func(2);
  func(3);
}
