i don't think this should link, since wrongaddr calls
fn with an Outer* not an Inner*.

#include <u.h>
#include <libc.h>

typedef struct  Inner   Inner;
typedef struct  Outer   Outer;

struct Inner {
        int     x;
};

struct Outer {
        char    buf[0x1000];
        Inner;
};

void
wrongaddr(Outer *o)
{
        static void fn(Outer*);

        fn(o);
}

void
main(void)
{
        Outer *o;

        o = malloc(sizeof *o);
        memset(o, 0, sizeof *o);
        print("addr o   %#p\n", o);
        print("addr o.x %#p\n", &o->x);
        wrongaddr(o);
}

static void
fn(Inner *i)
{
        print("fn addr i.x      %#p\n", &i->x);
}
; 6.cbug
addr o  0x4018f0
addr o.x        0x4028f0
fn addr i.x     0x4018f0

Reply via email to