https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93674
--- Comment #3 from Gábor Buella <gbuella at gmail dot com> --- In case anyone would still get confused about the what values get casted to enum, here is another way to write that example: enum some_enum { x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, xa, xb, xc, xd, xe, xf, x00, x01, x02, x03, x04, x05, x06, x07, x08, x09, x0a, x0b, x0c, x0d, x0e, x0f }; void sink(some_enum); void func() { for (int i = 0; i < 3; ++i) { int j = 3; while (j >= 0) { // Note: (i + j) is always non-negative here // Actually, (i + j) is always of the values // given when defining the type above. sink((some_enum)(i + j)); --j; } } }