(finish_struct): Don't assume that a target integer
authorRichard Stallman <rms@gnu.org>
Fri, 11 Sep 1992 08:52:38 +0000 (08:52 +0000)
committerRichard Stallman <rms@gnu.org>
Fri, 11 Sep 1992 08:52:38 +0000 (08:52 +0000)
fits in a HOST_WIDE_INT when checking bit-field widths.

From-SVN: r2105

gcc/c-decl.c

index 6a505395f6d7ccfb413590c6859e56934ec8e8ab..59d0c52491a5f58470afafd6e57a490ca7f1ec53 100644 (file)
@@ -4826,23 +4826,23 @@ finish_struct (t, fieldlist)
       /* Detect and ignore out of range field width.  */
       if (DECL_INITIAL (x))
        {
-         register int width = TREE_INT_CST_LOW (DECL_INITIAL (x));
+         unsigned HOST_WIDE_INT width = TREE_INT_CST_LOW (DECL_INITIAL (x));
 
-         if (width < 0)
+         if (tree_int_cst_lt (DECL_INITIAL (x), integer_zero_node))
            {
              DECL_INITIAL (x) = NULL;
              error_with_decl (x, "negative width in bit-field `%s'");
            }
-         else if (width == 0 && DECL_NAME (x) != 0)
+         else if (TREE_INT_CST_HIGH (DECL_INITIAL (x)) != 0
+                  || width > TYPE_PRECISION (TREE_TYPE (x)))
            {
-             error_with_decl (x, "zero width for bit-field `%s'");
              DECL_INITIAL (x) = NULL;
+             pedwarn_with_decl (x, "width of `%s' exceeds its type");
            }
-         else if (width > TYPE_PRECISION (TREE_TYPE (x))
-                  || TREE_INT_CST_HIGH (DECL_INITIAL (x)) != 0)
+         else if (width == 0 && DECL_NAME (x) != 0)
            {
+             error_with_decl (x, "zero width for bit-field `%s'");
              DECL_INITIAL (x) = NULL;
-             pedwarn_with_decl (x, "width of `%s' exceeds its type");
            }
        }