diff options
author | Janne Blomqvist <jb@gcc.gnu.org> | 2018-09-23 14:03:38 +0300 |
---|---|---|
committer | Janne Blomqvist <jb@gcc.gnu.org> | 2018-09-23 14:03:38 +0300 |
commit | 0f97b81b036b13272c350bbb3ff94afe3294ac2d (patch) | |
tree | 64b157df8c46f8fdeafe7720d1aa7c723b7b08a3 /gcc/fortran/trans-stmt.c | |
parent | ee7fb0588c6361b4d77337ab0f7527be64fcdde2 (diff) | |
download | gcc-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.c | 34 |
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); } } } |