re PR c++/89507 (bogus "size of array exceeds maximum object size")
[gcc.git] / gcc / tree.c
index 30e01df0ace64ac8ad11f92d7d90b8d94aee9798..0c70bb9cdd51083d2e6374d41c7b1e6511df58ad 100644 (file)
@@ -7533,19 +7533,16 @@ valid_constant_size_p (const_tree size, cst_size_error *perr /* = NULL */)
       return false;
     }
 
-  tree type = TREE_TYPE (size);
-  if (TYPE_UNSIGNED (type))
+  if (tree_int_cst_sgn (size) < 0)
     {
-      if (!tree_fits_uhwi_p (size)
-         || tree_int_cst_sign_bit (size))
-       {
-         *perr = cst_size_too_big;
-         return false;
-       }
+      *perr = cst_size_negative;
+      return false;
     }
-  else if (tree_int_cst_sign_bit (size))
+  if (!tree_fits_uhwi_p (size)
+      || (wi::to_widest (TYPE_MAX_VALUE (sizetype))
+         < wi::to_widest (size) * 2))
     {
-      *perr = cst_size_negative;
+      *perr = cst_size_too_big;
       return false;
     }