(finish_decl, grokdeclarator, finish_struct): Report overflows in storage sizes.
authorRichard Stallman <rms@gnu.org>
Tue, 2 Feb 1993 04:38:30 +0000 (04:38 +0000)
committerRichard Stallman <rms@gnu.org>
Tue, 2 Feb 1993 04:38:30 +0000 (04:38 +0000)
(finish_decl, grokdeclarator, finish_struct): Report
overflows in storage sizes.
(build_enumerator): Report overflows in enumerators.

From-SVN: r3402

gcc/c-decl.c

index 1a32e3c153a0ec28c7e73b095e691e9e10010ed5..96c1523ef796bd11a6a46ed6d0928ed682862b63 100644 (file)
@@ -3308,9 +3308,11 @@ finish_decl (decl, init, asmspec_tree)
        }
 
       if ((DECL_EXTERNAL (decl) || TREE_STATIC (decl))
-         && DECL_SIZE (decl) != 0
-         && TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
-       error_with_decl (decl, "storage size of `%s' isn't constant");
+         && DECL_SIZE (decl) != 0)
+       if (TREE_CODE (DECL_SIZE (decl)) == INTEGER_CST)
+         constant_expression_warning (DECL_SIZE (decl));
+       else
+         error_with_decl (decl, "storage size of `%s' isn't constant");
     }
 
   /* Output the assembler code and/or RTL code for variables and functions,
@@ -3961,6 +3963,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized)
                pedwarn ("ANSI C forbids zero-size array `%s'", name);
              if (TREE_CODE (size) == INTEGER_CST)
                {
+                 constant_expression_warning (size);
                  if (INT_CST_LT (size, integer_zero_node))
                    {
                      error ("size of array `%s' is negative", name);
@@ -4896,11 +4899,14 @@ finish_struct (t, fieldlist)
       /* Detect invalid bit-field size.  */
       if (DECL_INITIAL (x))
        STRIP_NOPS (DECL_INITIAL (x));
-      if (DECL_INITIAL (x) && TREE_CODE (DECL_INITIAL (x)) != INTEGER_CST)
-       {
-         error_with_decl (x, "bit-field `%s' width not an integer constant");
-         DECL_INITIAL (x) = NULL;
-       }
+      if (DECL_INITIAL (x))
+       if (TREE_CODE (DECL_INITIAL (x)) == INTEGER_CST)
+         constant_expression_warning (DECL_INITIAL (x));
+       else
+         {
+           error_with_decl (x, "bit-field `%s' width not an integer constant");
+           DECL_INITIAL (x) = NULL;
+         }
 
       /* Detect invalid bit-field type.  */
       if (DECL_INITIAL (x)
@@ -5308,12 +5314,15 @@ build_enumerator (name, value)
   if (value)
     STRIP_TYPE_NOPS (value);
 
-  if (value != 0 && TREE_CODE (value) != INTEGER_CST)
-    {
-      error ("enumerator value for `%s' not integer constant",
-            IDENTIFIER_POINTER (name));
-      value = 0;
-    }
+  if (value != 0)
+    if (TREE_CODE (value) == INTEGER_CST)
+      constant_expression_warning (value);
+    else
+      {
+       error ("enumerator value for `%s' not integer constant",
+              IDENTIFIER_POINTER (name));
+       value = 0;
+      }
 
   /* Default based on previous value.  */
   /* It should no longer be possible to have NON_LVALUE_EXPR