This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Use size_type_node instead of sizetype for stride overflow checking (PR fortran/46945)


Hi!

Using sizetype for testing whether stride * element_size will overflow
is wrong, because unlike all sane unsigned types, sizetype doesn't have
modulo semantics, but instead has undefined overflow.

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
trunk?

2010-12-15  Jakub Jelinek  <jakub@redhat.com>

	PR fortran/46945
	* trans-array.c (gfc_array_init_size): Perform stride overflow
	checking and multiplication by element_size in size_type_node instead
	of sizetype, return value with size_type_node type instead of
	sometimes with sizetype and sometimes with gfc_array_index_type.

	* gfortran.dg/pr46945.f90: New test.

--- gcc/fortran/trans-array.c.jj	2010-12-14 08:11:31.000000000 +0100
+++ gcc/fortran/trans-array.c	2010-12-15 12:16:49.000000000 +0100
@@ -4154,15 +4154,15 @@ gfc_array_init_size (tree descriptor, in
      size of an element to get the total size.  */
   tmp = TYPE_SIZE_UNIT (gfc_get_element_type (type));
   /* Convert to size_t.  */
-  element_size = fold_convert (sizetype, tmp);
-  stride = fold_convert (sizetype, stride);
+  element_size = fold_convert (size_type_node, tmp);
+  stride = fold_convert (size_type_node, stride);
 
   /* First check for overflow. Since an array of type character can
      have zero element_size, we must check for that before
      dividing.  */
   tmp = fold_build2_loc (input_location, TRUNC_DIV_EXPR, 
-			 sizetype, 
-			 TYPE_MAX_VALUE (sizetype), element_size);
+			 size_type_node,
+			 TYPE_MAX_VALUE (size_type_node), element_size);
   tmp = fold_build3_loc (input_location, COND_EXPR, integer_type_node,
 			 gfc_unlikely (fold_build2_loc (input_location, LT_EXPR, 
 							boolean_type_node, tmp, 
@@ -4178,7 +4178,7 @@ gfc_array_init_size (tree descriptor, in
 			 *overflow, tmp);
   *overflow = gfc_evaluate_now (tmp, pblock);
 
-  size = fold_build2_loc (input_location, MULT_EXPR, sizetype,
+  size = fold_build2_loc (input_location, MULT_EXPR, size_type_node,
 			  stride, element_size);
 
   if (poffset != NULL)
@@ -4190,11 +4190,11 @@ gfc_array_init_size (tree descriptor, in
   if (integer_zerop (or_expr))
     return size;
   if (integer_onep (or_expr))
-    return gfc_index_zero_node;
+    return build_int_cst (size_type_node, 0);
 
   var = gfc_create_var (TREE_TYPE (size), "size");
   gfc_start_block (&thenblock);
-  gfc_add_modify (&thenblock, var, size_zero_node);
+  gfc_add_modify (&thenblock, var, build_int_cst (size_type_node, 0));
   thencase = gfc_finish_block (&thenblock);
 
   gfc_start_block (&elseblock);
--- gcc/testsuite/gfortran.dg/pr46945.f90.jj	2010-12-15 12:22:11.000000000 +0100
+++ gcc/testsuite/gfortran.dg/pr46945.f90	2010-12-15 12:21:46.000000000 +0100
@@ -0,0 +1,10 @@
+! PR fortran/46945
+! { dg-do run }
+! { dg-options "-O -ftree-vrp -fno-tree-ccp -fno-tree-fre" }
+
+program pr46945
+  real, allocatable :: a(:,:,:)
+  integer :: n
+  n = 0
+  allocate (a(n,n,n))
+end program pr46945

	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]