/* PR45070 */ extern void abort(void); struct packed_ushort { unsigned short ucs; } __attribute__((packed)); struct source { int pos, length; int flag; }; static void __attribute__((noinline)) fetch(struct source *p) { p->length = 128; } static struct packed_ushort __attribute__((noinline)) next(struct source *p) { struct packed_ushort rv; if (p->pos >= p->length) { if (p->flag) { p->flag = 0; fetch(p); return next(p); } p->flag = 1; rv.ucs = 0xffff; return rv; } rv.ucs = 0; return rv; } int main(void) { struct source s; int i; s.pos = 0; s.length = 0; s.flag = 0; for (i = 0; i < 16; i++) { struct packed_ushort rv = next(&s); if ((i == 0 && rv.ucs != 0xffff) || (i > 0 && rv.ucs != 0)) abort(); } return 0; }