diff options
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); } |