unfortunately i let this one fester until it cost
us some time.  this problem has cropped up
again http://9fans.net/archive/2009/07/305
(it appears that my worry about expandable arrays
was unfounded.)

the problem is that the size of an undefined
struct as the last element of a struct is not
counted because it is not known at the time.
rather than diagnosing an incomplete reference,
the program compiles and prints an unespected
size, "sizeof A = 4 4".  i don't believe it should
compile at all.

the fix is simply this:

/n/dump/2009/0915/sys/src/cmd/cc/dcl.c:541,547 - dcl.c:541,547
                                l->offset = o;
                        } else {
                                if(l->width <= 0)
-                               if(l->down != T)
+                               if(l->down != T || l->width < 0)
                                        if(l->sym)
                                                diag(Z, "incomplete structure 
element: %s",
                                                        l->sym->name);

thanks to bwc for identifying the problem (again).
patch submitted: /n/sources/patch/incmpltdiag

- erik

---

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

typedef struct A A;
typedef struct B B;

struct A {
        int     a;
        B;
};

struct B {
        uchar   buf[512];
};

void
main(void)
{
        A a;
        B b;

        print("sizeof A = %d %d\n", sizeof(A), sizeof a);
        print("sizeof B = %d %d\n", sizeof(B), sizeof b);
}

Reply via email to