http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46806
Jonathan Wakely <redi at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|RESOLVED |UNCONFIRMED Resolution|INVALID | --- Comment #8 from Jonathan Wakely <redi at gcc dot gnu.org> 2010-12-05 19:27:39 UTC --- Hmm, I might have been too hasty declaring this invalid. The comparisons are ok, with or without casts, I think the problem is this line: Value = static_cast<TEValue>(Eight); The optimiser thinks that because you do that cast, that implies that Eight must be in the range [0,7] always, not just when you've checked that it is actually in range. Changing that line to this prevents the condition always being true: Value = static_cast<TEValue>(Eight%8); The condition before that line should ensure that's not needed, because you've already ensured the value is in range, so maybe there is a bug here, which is hidden in 4.6 by -fstrict-enums being off by default. I'm re-opening this again, could a front-end or middle-end maintainer comment on whether this really is invalid?