--- gcc/fold-const.c    (revision 194900)
+++ gcc/fold-const.c    (working copy)
@@ -900,9 +900,9 @@ associate_trees (location_t loc, tree t1
 static bool
 int_binop_types_match_p (enum tree_code code, const_tree type1, const_tree type2)
 {
-  if (TREE_CODE (type1) != INTEGER_TYPE && !POINTER_TYPE_P (type1))
+  if (!INTEGRAL_TYPE_P (type1) && !POINTER_TYPE_P (type1))
     return false;
-  if (TREE_CODE (type2) != INTEGER_TYPE && !POINTER_TYPE_P (type2))
+  if (!INTEGRAL_TYPE_P (type2) && !POINTER_TYPE_P (type2))
     return false;
 
   switch (code)
--- gcc/testsuite/gcc.c-torture/compile/pr55851.c.jj	2013-01-03 16:20:19.085284806 +0100
+++ gcc/testsuite/gcc.c-torture/compile/pr55851.c	2013-01-03 16:19:27.698571718 +0100
@@ -0,0 +1,12 @@
+/* PR middle-end/55851 */
+
+enum { A = 1UL, B = -1UL } var = A;
+void foo (char *);
+
+void
+test (void)
+{
+  char vla[1][var];
+  vla[0][0] = 1;
+  foo (&vla[0][0]);
+}
