------- Comment #2 from stubbs at icerasemi dot com 2010-01-05 11:14 ------- This code should do it:
--- extern void *malloc(int); extern void abort(void); extern void free(void *); typedef struct SEntry { unsigned char num; } TEntry; typedef struct STable { TEntry data[2]; } TTable; TTable *init () { return malloc(sizeof(TTable)); } void expect_func (int a, unsigned char *b) __attribute__ ((noinline)); static inline void inlined_wrong (TEntry *entry_p, int flag); void inlined_wrong (TEntry *entry_p, int flag) { unsigned char index; entry_p->num = 0; if (flag == 0) abort(); for (index = 0; index < 1; index++) entry_p->num++; if (!entry_p->num) { abort(); } } void expect_func (int a, unsigned char *b) { if (abs ((a == 0))) abort (); if (abs ((b == 0))) abort (); } int main () { unsigned char index = 0; TTable *table_p = init(); TEntry work; inlined_wrong (&(table_p->data[1]), 1); expect_func (1, &index); inlined_wrong (&work, 1); free (table_p); return 1; } --- Built with the command line: --- gcc -O2 -finline-functions-called-once fail.c --- When built with GCC 4.4.1 the resultant executable incorrectly calls abort. When built with GCC 3.4.6 the resultant executable doesn't abort. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42614