]> gcc.gnu.org Git - gcc.git/blobdiff - gcc/convert.c
(convert_to_integer): Don't pass truncate into ABS_EXPR.
[gcc.git] / gcc / convert.c
index 7261e1baa8ed2db88c94bfb345e28dfb49ef5817..032bb516899351f59e5fd633e83d1464a9c88c28 100644 (file)
@@ -199,11 +199,22 @@ convert_to_integer (type, expr)
                /* In this case, shifting is like multiplication.  */
                goto trunc1;
              else
-               /* If it is >= that width, result is zero.
-                  Handling this with trunc1 would give the wrong result:
-                  (int) ((long long) a << 32) is well defined (as 0)
-                  but (int) a << 32 is undefined and would get a warning.  */
-               return convert_to_integer (type, integer_zero_node);
+               {
+                 /* If it is >= that width, result is zero.
+                    Handling this with trunc1 would give the wrong result:
+                    (int) ((long long) a << 32) is well defined (as 0)
+                    but (int) a << 32 is undefined and would get a
+                    warning.  */
+
+                 tree t = convert_to_integer (type, integer_zero_node);
+
+                 /* If the original expression had side-effects, we must
+                    preserve it.  */
+                 if (TREE_SIDE_EFFECTS (expr))
+                   return build (COMPOUND_EXPR, type, expr, t);
+                 else
+                   return t;
+               }
            }
          break;
 
@@ -280,7 +291,8 @@ convert_to_integer (type, expr)
 
        case NEGATE_EXPR:
        case BIT_NOT_EXPR:
-       case ABS_EXPR:
+         /* This is not correct for ABS_EXPR,
+            since we must test the sign before truncation.  */
          {
            register tree typex = type;
 
This page took 0.030078 seconds and 5 git commands to generate.