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-expr.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-expr.c')
-rw-r--r-- | gcc/fortran/trans-expr.c | 42 |
1 files changed, 19 insertions, 23 deletions
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 94f1d4d..edc1c10 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -2095,60 +2095,56 @@ gfc_caf_get_image_index (stmtblock_t *block, gfc_expr *e, tree desc) integer_zero_node); } - img_idx = integer_zero_node; - extent = integer_one_node; + img_idx = build_zero_cst (gfc_array_index_type); + extent = build_one_cst (gfc_array_index_type); if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (desc))) for (i = ref->u.ar.dimen; i < ref->u.ar.dimen + ref->u.ar.codimen; i++) { gfc_init_se (&se, NULL); - gfc_conv_expr_type (&se, ref->u.ar.start[i], integer_type_node); + gfc_conv_expr_type (&se, ref->u.ar.start[i], gfc_array_index_type); gfc_add_block_to_block (block, &se.pre); lbound = gfc_conv_descriptor_lbound_get (desc, gfc_rank_cst[i]); tmp = fold_build2_loc (input_location, MINUS_EXPR, - integer_type_node, se.expr, - fold_convert(integer_type_node, lbound)); - tmp = fold_build2_loc (input_location, MULT_EXPR, integer_type_node, + TREE_TYPE (lbound), se.expr, lbound); + tmp = fold_build2_loc (input_location, MULT_EXPR, TREE_TYPE (tmp), extent, tmp); - img_idx = fold_build2_loc (input_location, PLUS_EXPR, integer_type_node, - img_idx, tmp); + img_idx = fold_build2_loc (input_location, PLUS_EXPR, + TREE_TYPE (tmp), img_idx, tmp); if (i < ref->u.ar.dimen + ref->u.ar.codimen - 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); } } else for (i = ref->u.ar.dimen; i < ref->u.ar.dimen + ref->u.ar.codimen; i++) { gfc_init_se (&se, NULL); - gfc_conv_expr_type (&se, ref->u.ar.start[i], integer_type_node); + gfc_conv_expr_type (&se, ref->u.ar.start[i], gfc_array_index_type); gfc_add_block_to_block (block, &se.pre); lbound = GFC_TYPE_ARRAY_LBOUND (TREE_TYPE (desc), i); - lbound = fold_convert (integer_type_node, lbound); tmp = fold_build2_loc (input_location, MINUS_EXPR, - integer_type_node, se.expr, lbound); - tmp = fold_build2_loc (input_location, MULT_EXPR, integer_type_node, + TREE_TYPE (lbound), se.expr, lbound); + tmp = fold_build2_loc (input_location, MULT_EXPR, TREE_TYPE (tmp), extent, tmp); - img_idx = fold_build2_loc (input_location, PLUS_EXPR, integer_type_node, + img_idx = fold_build2_loc (input_location, PLUS_EXPR, TREE_TYPE (tmp), img_idx, tmp); if (i < ref->u.ar.dimen + ref->u.ar.codimen - 1) { ubound = GFC_TYPE_ARRAY_UBOUND (TREE_TYPE (desc), i); - ubound = fold_convert (integer_type_node, ubound); tmp = fold_build2_loc (input_location, MINUS_EXPR, - integer_type_node, ubound, lbound); - tmp = fold_build2_loc (input_location, PLUS_EXPR, integer_type_node, - tmp, integer_one_node); + TREE_TYPE (ubound), ubound, lbound); + tmp = fold_build2_loc (input_location, PLUS_EXPR, TREE_TYPE (tmp), + tmp, build_one_cst (TREE_TYPE (tmp))); extent = fold_build2_loc (input_location, MULT_EXPR, - integer_type_node, extent, tmp); + TREE_TYPE (tmp), extent, tmp); } } - img_idx = fold_build2_loc (input_location, PLUS_EXPR, integer_type_node, - img_idx, integer_one_node); - return img_idx; + img_idx = fold_build2_loc (input_location, PLUS_EXPR, TREE_TYPE (img_idx), + img_idx, build_one_cst (TREE_TYPE (img_idx))); + return fold_convert (integer_type_node, img_idx); } |