aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/trans-stmt.c
diff options
context:
space:
mode:
authorJanne Blomqvist <jb@gcc.gnu.org>2018-09-23 14:03:38 +0300
committerJanne Blomqvist <jb@gcc.gnu.org>2018-09-23 14:03:38 +0300
commit0f97b81b036b13272c350bbb3ff94afe3294ac2d (patch)
tree64b157df8c46f8fdeafe7720d1aa7c723b7b08a3 /gcc/fortran/trans-stmt.c
parentee7fb0588c6361b4d77337ab0f7527be64fcdde2 (diff)
downloadgcc-0f97b81b036b13272c350bbb3ff94afe3294ac2d.zip
gcc-0f97b81b036b13272c350bbb3ff94afe3294ac2d.tar.gz
gcc-0f97b81b036b13272c350bbb3ff94afe3294ac2d.tar.bz2
Do array index calculations in gfc_array_index_type
It was recently noticed that for a few of the coarray intrinsics array index calculations were done in integer_type_node instead of gfc_array_index_type. This patch fixes this. Regtested on x86_64-pc-linux-gnu. gcc/fortran/ChangeLog: 2018-09-23 Janne Blomqvist <jb@gcc.gnu.org> * trans-expr.c (gfc_caf_get_image_index): Do array index calculations in gfc_array_index_type. * trans-intrinsic.c (conv_intrinsic_event_query): Likewise. * trans-stmt.c (gfc_trans_lock_unlock): Likewise. (gfc_trans_event_post_wait): Likewise. gcc/testsuite/ChangeLog: 2018-09-23 Janne Blomqvist <jb@gcc.gnu.org> * gfortran.dg/coarray_lib_alloc_4.f90: Fix scan patterns. * gfortran.dg/coarray_lock_7.f90: Likewise. From-SVN: r264513
Diffstat (limited to 'gcc/fortran/trans-stmt.c')
-rw-r--r--gcc/fortran/trans-stmt.c34
1 files changed, 15 insertions, 19 deletions
diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c
index 833c6c5..ef9e519 100644
--- a/gcc/fortran/trans-stmt.c
+++ b/gcc/fortran/trans-stmt.c
@@ -841,7 +841,7 @@ gfc_trans_lock_unlock (gfc_code *code, gfc_exec_op op)
if (flag_coarray == GFC_FCOARRAY_LIB)
{
tree tmp, token, image_index, errmsg, errmsg_len;
- tree index = size_zero_node;
+ tree index = build_zero_cst (gfc_array_index_type);
tree caf_decl = gfc_get_tree_for_caf_expr (code->expr1);
if (code->expr1->symtree->n.sym->ts.type != BT_DERIVED
@@ -884,27 +884,25 @@ gfc_trans_lock_unlock (gfc_code *code, gfc_exec_op op)
desc = argse.expr;
*ar = ar2;
- extent = integer_one_node;
+ extent = build_one_cst (gfc_array_index_type);
for (i = 0; i < ar->dimen; i++)
{
gfc_init_se (&argse, NULL);
- gfc_conv_expr_type (&argse, ar->start[i], integer_type_node);
+ gfc_conv_expr_type (&argse, ar->start[i], gfc_array_index_type);
gfc_add_block_to_block (&argse.pre, &argse.pre);
lbound = gfc_conv_descriptor_lbound_get (desc, gfc_rank_cst[i]);
tmp = fold_build2_loc (input_location, MINUS_EXPR,
- integer_type_node, argse.expr,
- fold_convert(integer_type_node, lbound));
+ TREE_TYPE (lbound), argse.expr, lbound);
tmp = fold_build2_loc (input_location, MULT_EXPR,
- integer_type_node, extent, tmp);
+ TREE_TYPE (tmp), extent, tmp);
index = fold_build2_loc (input_location, PLUS_EXPR,
- integer_type_node, index, tmp);
+ TREE_TYPE (tmp), index, tmp);
if (i < ar->dimen - 1)
{
ubound = gfc_conv_descriptor_ubound_get (desc, gfc_rank_cst[i]);
tmp = gfc_conv_array_extent_dim (lbound, ubound, NULL);
- tmp = fold_convert (integer_type_node, tmp);
extent = fold_build2_loc (input_location, MULT_EXPR,
- integer_type_node, extent, tmp);
+ TREE_TYPE (tmp), extent, tmp);
}
}
}
@@ -938,6 +936,7 @@ gfc_trans_lock_unlock (gfc_code *code, gfc_exec_op op)
lock_acquired = gfc_create_var (integer_type_node, "acquired");
}
+ index = fold_convert (size_type_node, index);
if (op == EXEC_LOCK)
tmp = build_call_expr_loc (input_location, gfor_fndecl_caf_lock, 7,
token, index, image_index,
@@ -1038,7 +1037,7 @@ gfc_trans_event_post_wait (gfc_code *code, gfc_exec_op op)
gfc_start_block (&se.pre);
tree tmp, token, image_index, errmsg, errmsg_len;
- tree index = size_zero_node;
+ tree index = build_zero_cst (gfc_array_index_type);
tree caf_decl = gfc_get_tree_for_caf_expr (code->expr1);
if (code->expr1->symtree->n.sym->ts.type != BT_DERIVED
@@ -1083,28 +1082,25 @@ gfc_trans_event_post_wait (gfc_code *code, gfc_exec_op op)
desc = argse.expr;
*ar = ar2;
- extent = integer_one_node;
+ extent = build_one_cst (gfc_array_index_type);
for (i = 0; i < ar->dimen; i++)
{
gfc_init_se (&argse, NULL);
- gfc_conv_expr_type (&argse, ar->start[i], integer_type_node);
+ gfc_conv_expr_type (&argse, ar->start[i], gfc_array_index_type);
gfc_add_block_to_block (&argse.pre, &argse.pre);
lbound = gfc_conv_descriptor_lbound_get (desc, gfc_rank_cst[i]);
tmp = fold_build2_loc (input_location, MINUS_EXPR,
- integer_type_node, argse.expr,
- fold_convert(integer_type_node, lbound));
+ TREE_TYPE (lbound), argse.expr, lbound);
tmp = fold_build2_loc (input_location, MULT_EXPR,
- integer_type_node, extent, tmp);
+ TREE_TYPE (tmp), extent, tmp);
index = fold_build2_loc (input_location, PLUS_EXPR,
- gfc_array_index_type, index,
- fold_convert (gfc_array_index_type, tmp));
+ TREE_TYPE (tmp), index, tmp);
if (i < ar->dimen - 1)
{
ubound = gfc_conv_descriptor_ubound_get (desc, gfc_rank_cst[i]);
tmp = gfc_conv_array_extent_dim (lbound, ubound, NULL);
- tmp = fold_convert (integer_type_node, tmp);
extent = fold_build2_loc (input_location, MULT_EXPR,
- integer_type_node, extent, tmp);
+ TREE_TYPE (tmp), extent, tmp);
}
}
}