re PR fortran/46945 (gfortran.dg/unpack_zerosize_1.f90 FAILs with -ftree-vrp -fno...
authorJakub Jelinek <jakub@redhat.com>
Wed, 15 Dec 2010 20:20:10 +0000 (21:20 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 15 Dec 2010 20:20:10 +0000 (21:20 +0100)
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.

From-SVN: r167871

gcc/fortran/ChangeLog
gcc/fortran/trans-array.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr46945.f90 [new file with mode: 0644]

index afab6870a3f2aaf8bf39a5c5a92e85edfaaf1ed9..2c4de57e31e886232206e0ef59f17370527adc00 100644 (file)
@@ -1,3 +1,11 @@
+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.
+
 2010-12-15  Janne Blomqvist  <jb@gcc.gnu.org>
 
        * trans.c (gfc_allocate_with_status): Better error message for
index d8c37a52d07a97c7b0d370e9fb4db1ea6b209603..7ea84c75d8f05180aebcc31dac4dfb00ba17b089 100644 (file)
@@ -4006,6 +4006,7 @@ gfc_array_init_size (tree descriptor, int rank, int corank, tree * poffset,
   tree or_expr;
   tree thencase;
   tree elsecase;
+  tree cond;
   tree var;
   stmtblock_t thenblock;
   stmtblock_t elseblock;
@@ -4091,17 +4092,15 @@ gfc_array_init_size (tree descriptor, int rank, int corank, tree * poffset,
                             fold_convert (gfc_array_index_type, 
                                           TYPE_MAX_VALUE (gfc_array_index_type)),
                                           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, stride)),
-        integer_one_node, integer_zero_node);
-      tmp = fold_build3_loc 
-       (input_location, COND_EXPR, integer_type_node,
-        gfc_unlikely (fold_build2_loc (input_location, EQ_EXPR,
-                                       boolean_type_node, size, 
-                                       build_zero_cst (gfc_array_index_type))),
-        integer_zero_node, tmp);
+      cond = gfc_unlikely (fold_build2_loc (input_location, LT_EXPR,
+                                           boolean_type_node, tmp, stride));
+      tmp = fold_build3_loc (input_location, COND_EXPR, integer_type_node, cond,
+                            integer_one_node, integer_zero_node);
+      cond = gfc_unlikely (fold_build2_loc (input_location, EQ_EXPR,
+                                           boolean_type_node, size,
+                                           gfc_index_zero_node));
+      tmp = fold_build3_loc (input_location, COND_EXPR, integer_type_node, cond,
+                            integer_zero_node, tmp);
       tmp = fold_build2_loc (input_location, PLUS_EXPR, integer_type_node,
                             *overflow, tmp);
       *overflow = gfc_evaluate_now (tmp, pblock);
@@ -4154,31 +4153,29 @@ gfc_array_init_size (tree descriptor, int rank, int corank, tree * poffset,
      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);
-  tmp = fold_build3_loc (input_location, COND_EXPR, integer_type_node,
-                        gfc_unlikely (fold_build2_loc (input_location, LT_EXPR, 
-                                                       boolean_type_node, tmp, 
-                                                       stride)),
+                        size_type_node,
+                        TYPE_MAX_VALUE (size_type_node), element_size);
+  cond = gfc_unlikely (fold_build2_loc (input_location, LT_EXPR,
+                                       boolean_type_node, tmp, stride));
+  tmp = fold_build3_loc (input_location, COND_EXPR, integer_type_node, cond,
                         integer_one_node, integer_zero_node);
-  tmp = fold_build3_loc (input_location, COND_EXPR, integer_type_node,
-                        gfc_unlikely (fold_build2_loc (input_location, EQ_EXPR,
-                                                       boolean_type_node, 
-                                                       element_size, 
-                                                       size_zero_node)),
+  cond = gfc_unlikely (fold_build2_loc (input_location, EQ_EXPR,
+                                       boolean_type_node, element_size,
+                                       build_int_cst (size_type_node, 0)));
+  tmp = fold_build3_loc (input_location, COND_EXPR, integer_type_node, cond,
                         integer_zero_node, tmp);
   tmp = fold_build2_loc (input_location, PLUS_EXPR, integer_type_node,
                         *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 +4187,11 @@ gfc_array_init_size (tree descriptor, int rank, int corank, tree * poffset,
   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);
index a8cb558489490edb819c1693c5cc67eb259a6d2f..09170a2819310db6e9dd93c2a9f6008ed3d8af03 100644 (file)
@@ -1,5 +1,8 @@
 2010-12-15  Jakub Jelinek  <jakub@redhat.com>
 
+       PR fortran/46945
+       * gfortran.dg/pr46945.f90: New test.
+
        PR debug/46815
        * g++.dg/guality/pr46815.C: New test.
 
diff --git a/gcc/testsuite/gfortran.dg/pr46945.f90 b/gcc/testsuite/gfortran.dg/pr46945.f90
new file mode 100644 (file)
index 0000000..da4d7c7
--- /dev/null
@@ -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