On Fri, Jan 04, 2013 at 02:21:43PM +0100, Richard Biener wrote:
> The other way would be
> 
> Index: gcc/fold-const.c
> ===================================================================
> --- 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)

Ok, as discussed on IRC, here is your version, ok for trunk?
Bootstrapped/regtested on x86_64-linux and i686-linux.

2013-01-06  Jakub Jelinek  <ja...@redhat.com>
            Richard Biener  <rguent...@suse.de>

        PR middle-end/55851
        * fold-const.c (int_binop_types_match_p): Allow all INTEGRAL_TYPE_P
        types instead of just INTEGER_TYPE types.

        * gcc.c-torture/compile/pr55851.c: New test.

--- 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]);
+}

        Jakub

Reply via email to