/* { dg-do compile } */ /* { dg-options "-O2 -w" } */ typedef unsigned int hashval_t; enum ETYPE { ETYPE_ARRAY, ETYPE_STRUCT, ETYPE_UNION, }; struct entry { enum ETYPE etype:8; unsigned short len; const char *attrib; }; hashval_t iterative_hash (const struct entry *, __SIZE_TYPE__, hashval_t); hashval_t e_hash (const void *a) { const struct entry *e = a; hashval_t ret = 0; int i; if (e[0].etype != ETYPE_STRUCT && e[0].etype != ETYPE_UNION) __builtin_abort (); for (i = 0; i <= e[0].len; ++i) { ret = iterative_hash (&e[i], __builtin_offsetof (struct entry, attrib), ret); } return ret; }