=== modified file 'src/alloc.c' --- src/alloc.c 2012-11-08 14:10:28 +0000 +++ src/alloc.c 2012-11-08 15:05:02 +0000 @@ -2611,16 +2611,18 @@ #define VINDEX(nbytes) (((nbytes) - VBLOCK_BYTES_MIN) / roundup_size) -/* When V is on the free list, first word after header is used as a pointer - to next vector on the free list. It might be done in a better way with: - - (*(struct Lisp_Vector **)&(v->contents[0])) - - but this breaks GCC's strict-aliasing rules (which looks more relaxed - for char and void pointers). */ - -#define NEXT_IN_FREE_LIST(v) \ - (*(struct Lisp_Vector **)((char *) v + header_size)) +/* This is a pseudo vectorlike object used to represent any + block-allocated vectorlike object on the free list. */ + +struct Lisp_Vectorlike_Free +{ + struct vectorlike_header header; + struct Lisp_Vector *next; +}; + +/* When V is on the free list, it's always treated as Lisp_Vectorlike_Free. */ + +#define NEXT_IN_FREE_LIST(v) ((struct Lisp_Vectorlike_Free *) v)->next /* Common shortcut to setup vector on a free list. */