aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/trans-array.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2010-12-15 21:20:10 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2010-12-15 21:20:10 +0100
commit79cae72e5db5f65ba3dc5ebdb3e8c8063a0c47aa (patch)
treed12dca7941696c16152f73535639f61e74287638 /gcc/fortran/trans-array.c
parent50ba28bb635a2a4d451efc108634f9ae0cb8b0a4 (diff)
downloadgcc-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
Diffstat (limited to 'gcc/fortran/trans-array.c')
-rw-r--r--gcc/fortran/trans-array.c51
1 files changed, 24 insertions, 27 deletions
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);