void abort(void);
void exit(int);

struct s {
    long a;
    int b;
};

int foo(int x, void *y) {
    switch (x) {
    case 0: return ((struct s *)y)->a;
    case 1: return *(signed char *)y;
    case 2: return *(short *)y;
    }
    abort();
}

int main() {
    struct s s;
    short sh[10];
    signed char c[10];
    int i;

    s.a = 1;
    s.b = 2;
    for (i = 0; i < 10; i++) {
        sh[i] = i;
        c[i] = i;
    }

    if (foo(0, &s) != 1) abort();
    if (foo(1, c + 3) != 3) abort();
    if (foo(2, sh + 3) != 3) abort();
    exit(0);
}
