(convert_to_integer): Warn if integer is truncated and that changes the value.
authorRichard Stallman <rms@gnu.org>
Fri, 19 Feb 1993 05:46:22 +0000 (05:46 +0000)
committerRichard Stallman <rms@gnu.org>
Fri, 19 Feb 1993 05:46:22 +0000 (05:46 +0000)
From-SVN: r3496

gcc/convert.c

index c67f510188c201d7c4770dc6727d59cd018e5285..0833a5fbcd7a177f5548e920af72f401659cb84f 100644 (file)
@@ -172,6 +172,30 @@ convert_to_integer (type, expr)
 
       switch (ex_form)
        {
+        case INTEGER_CST:
+         if (TREE_UNSIGNED (type))
+           {
+             if (TREE_INT_CST_LOW (expr) >> outprec)
+               warning ("integer constant truncated");
+           }
+         else
+           {
+             /* if the sign bit of the low-order part isn't replicated
+                through the entire high part, we have overflow */
+             int sign  = TREE_INT_CST_LOW (expr) & (1 << (outprec - 1));
+             if (!sign)                       /* lower part positive */
+               {
+                 if (TREE_INT_CST_LOW (expr) >> outprec)
+                   warning ("integer constant truncated");
+               }
+             else 
+               {
+                 if ((TREE_INT_CST_LOW (expr) >> outprec) + 1)
+                   warning ("integer constant truncated");
+               }
+           }
+         break;
+
        case RSHIFT_EXPR:
          /* We can pass truncation down through right shifting
             when the shift count is a nonpositive constant.  */