void abort(void);

typedef struct {
    char *addr;
    long type;
} object;

object bar(object blah) {
    abort();
}

object foo(object x, object y) {
    object z = *(object *)(x.addr);
    if (z.type & 64) {
        y = *(object *)(z.addr + sizeof(object));
        z = *(object *)(z.addr);
        if (z.type & 64)
            y = bar(y);
    }
    return y;
}

int nil;
object cons1[2] = {{(char *)&nil, 0}, {(char *)&nil, 0}};
object cons2[2] = {{(char *)&cons1, 64}, {(char *)&nil, 0}};

int main(void) {
    object x = {(char *)&cons2, 64};
    object y = {(char *)&nil, 0};
    object three = foo(x, y);
    return 0;
}
/* { dg-require-effective-target nested } */
