File ‹pointers_to_locals.c›

/*
 * Copyright (c) 2022 Apple Inc. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-2-Clause
 */

typedef unsigned plain_array[3];
typedef struct pair {
  unsigned first;
  unsigned snd;
} pair;

typedef struct buffer {
  unsigned buf[2];
  unsigned size;
} buffer;


void inc (unsigned* y) {
  *y = *y + 1;
}

void dec (unsigned* y) {
  *y = *y - 1;
}

void inc_untyp(unsigned *ptr) {
  inc(ptr);
  /** AUXUPD: "(True, ptr_retyp (ptr_coerce ´ptr :: unit ptr))" */
}

unsigned odd(unsigned n);
unsigned even(unsigned n) {
  if (n == 0) {
     return 1;
  } else {
     dec(&n);
     return odd(n);
  }
};
unsigned odd(unsigned n) {
  if (n == 1) {
    return 1;
  } else {
    dec(&n);
    return even(n);
  }
};


unsigned g = 42;

void call_inc_global(void) {
  inc(&g);
}

unsigned call_inc_local_uninitialized(void) {
  unsigned m;
  inc(&m);
  return(42);
}

unsigned call_inc_local_initialized(void) {
  unsigned m = 42;
  inc(&m);
  return(m);
}

unsigned call_inc_parameter(unsigned n) {
  inc(&n);
  return(n);
}


unsigned call_inc_array(unsigned i) {
  plain_array arr;
  inc(&(arr[i]));
  return arr[i];
}

unsigned call_inc_buffer(unsigned i) {
  buffer b;
  inc(&(b.buf[i]));
  return b.buf[i];
}

unsigned call_inc_first(void) {
  pair tuple;
  inc(&(tuple.first));
  return tuple.first;
}


unsigned call_inc_untyp(unsigned i) {
  inc_untyp(&i);
  return i;
}

unsigned call_inc_nested(unsigned i) {
  unsigned m;
  unsigned n;
  inc(&m);
  inc(&i);
  inc(&n);
  return (m + i + n);
}


void f1(unsigned *x)
{
  *x = 0;
  exit(1);
}

void g1(void)
{
  unsigned x;
  f1(&x);
}

/*
void f2(int *x)
{
  *x = 0;
  exit(1);
}

void g2(void)
{
  int x;
  f1(&x);
}

*/