This is gcc-4.2.0-0.20060806r115974 Source:
---------------------------------------------------------------------- typedef struct descr *descr_t; typedef descr_t *value_t; struct descr {descr_t descr;}; typedef struct {descr_t descr; value_t fields[2];} object_t_2; value_t **marked_top, **marked_limit; void gc(void); object_t_2 pair_12138, list_12140, pair_12196, list_12198, pair_12319, list_12321, list_12328, pair_12334, pair_12336, record_12376, pair_12413, list_12415, record_12420; value_t symbol_7584, symbol_12137, symbol_7525, symbol_11238, symbol_7778, symbol_12326, symbol_11917, symbol_7927, symbol_7525, symbol_11238, symbol_12335, CheckArity, symbol_7584, symbol_7583, BadArguments; static inline void set_global_field(value_t obj, int i, value_t value) { value_t *ptr = (value_t *)obj + i + 1; *ptr = value; *marked_top++ = ptr; if (marked_limit < marked_top) gc(); } int test(void) { set_global_field(&pair_12138.descr, 0, symbol_7584); set_global_field(&list_12140.descr, 0, symbol_12137); set_global_field(&pair_12196.descr, 0, symbol_7525); set_global_field(&list_12198.descr, 0, symbol_7778); set_global_field(&pair_12319.descr, 1, symbol_11238); set_global_field(&list_12321.descr, 0, symbol_7778); set_global_field(&list_12328.descr, 0, symbol_11917); set_global_field(&pair_12334.descr, 0, symbol_7525); set_global_field(&pair_12334.descr, 1, symbol_11238); set_global_field(&pair_12336.descr, 0, symbol_12335); set_global_field(&record_12376.descr, 0, CheckArity); set_global_field(&pair_12413.descr, 0, symbol_7584); set_global_field(&list_12415.descr, 0, symbol_7583); set_global_field(&record_12420.descr, 0, BadArguments); return 0; } ---------------------------------------------------------------------- When compiled with gcc -S -O2 source.c, the last set_global_field call generates the following code: leal 4(%edx), %eax cmpl marked_limit, %eax movl BadArguments, %ecx movl $record_12420+4, (%edx) movl %eax, marked_top jbe .L28 movl %ecx, record_12420+4 call gc .L28: leave xorl %eax, %eax ret The assignment of BadArguments to the field of record_12420 is performed only in one branch, while it should be done unconditionally. Reducing the number of set_global_field calls avoids the bug. -- __("< Marcin Kowalczyk \__/ [EMAIL PROTECTED] ^^ http://qrnik.knm.org.pl/~qrczak/