http://gcc.gnu.org/ml/gcc-patches/2004-07/msg00968.html
http://blog.janik.cz/archives/2004-11-23T22_37_37.html

--- gcc/fold-const.c.orig	Tue Jun  1 08:15:12 2004
+++ gcc/fold-const.c	Wed Nov 24 16:39:02 2004
@@ -3535,7 +3535,13 @@
       HOST_WIDE_INT hi;
       int prec;
 
-      prec = TYPE_PRECISION (etype);
+      /* For enums the comparison will be done in the underlying type,
+	 so using enum's precision is wrong here.
+	 Consider e.g. enum { A, B, C, D, E }, low == B and high == D.  */
+      if (TREE_CODE (etype) == ENUMERAL_TYPE)
+	prec = GET_MODE_BITSIZE (TYPE_MODE (etype));
+      else
+	prec = TYPE_PRECISION (etype);
       if (prec <= HOST_BITS_PER_WIDE_INT)
 	{
 	  hi = 0;