diff options
author | Jakub Jelinek <jakub@redhat.com> | 2010-12-15 21:20:10 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2010-12-15 21:20:10 +0100 |
commit | 79cae72e5db5f65ba3dc5ebdb3e8c8063a0c47aa (patch) | |
tree | d12dca7941696c16152f73535639f61e74287638 | |
parent | 50ba28bb635a2a4d451efc108634f9ae0cb8b0a4 (diff) | |
download | gcc-79cae72e5db5f65ba3dc5ebdb3e8c8063a0c47aa.zip gcc-79cae72e5db5f65ba3dc5ebdb3e8c8063a0c47aa.tar.gz gcc-79cae72e5db5f65ba3dc5ebdb3e8c8063a0c47aa.tar.bz2 |
re PR fortran/46945 (gfortran.dg/unpack_zerosize_1.f90 FAILs with -ftree-vrp -fno-tree-ccp -fno-tree-fre)
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
-rw-r--r-- | gcc/fortran/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/fortran/trans-array.c | 51 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr46945.f90 | 10 |
4 files changed, 45 insertions, 27 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index afab687..2c4de57 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -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 diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index d8c37a5..7ea84c7 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a8cb558..09170a2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 index 0000000..da4d7c7 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr46945.f90 @@ -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 |