https://gcc.gnu.org/g:bc69b7fbedcc7970a7d055d6777e19dbdbb0f736
commit bc69b7fbedcc7970a7d055d6777e19dbdbb0f736 Author: Mikael Morin <[email protected]> Date: Thu Jun 25 20:33:35 2026 +0200 Introductio signed_char_type_node et dim_iter_type_node Diff: --- gcc/fortran/trans-array.cc | 2 +- gcc/fortran/trans-const.cc | 2 +- gcc/fortran/trans-decl.cc | 14 +++++++------- gcc/fortran/trans-expr.cc | 6 +++--- gcc/fortran/trans-types.cc | 15 ++++++++++++++- gcc/fortran/trans-types.h | 10 ++++++++++ 6 files changed, 36 insertions(+), 13 deletions(-) diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc index 25e9394b530c..eef65622420b 100644 --- a/gcc/fortran/trans-array.cc +++ b/gcc/fortran/trans-array.cc @@ -8631,7 +8631,7 @@ gfc_tree_array_size (stmtblock_t *block, tree desc, gfc_expr *expr, tree dim) gfc_init_block (&loop_body); /* Loop: for (i = 0; i < rank; ++i). */ - tree idx = gfc_create_var (signed_char_type_node, "idx"); + tree idx = gfc_create_var (gfc_dim_iter_type_node, "idx"); /* Loop body. */ /* #if (assumed-rank + !allocatable && !pointer) if (idx == rank - 1 && dim[idx].ubound == -1) diff --git a/gcc/fortran/trans-const.cc b/gcc/fortran/trans-const.cc index e21bcf68c0ce..34fd39a903f1 100644 --- a/gcc/fortran/trans-const.cc +++ b/gcc/fortran/trans-const.cc @@ -194,7 +194,7 @@ gfc_init_constants (void) int n; for (n = 0; n <= GFC_MAX_DIMENSIONS; n++) - gfc_rank_cst[n] = build_int_cst (gfc_array_index_type, n); + gfc_rank_cst[n] = build_int_cst (gfc_rank_type_node, n); } /* Converts a GMP integer into a backend tree node. */ diff --git a/gcc/fortran/trans-decl.cc b/gcc/fortran/trans-decl.cc index 2f3abff0e0a4..ee7453354964 100644 --- a/gcc/fortran/trans-decl.cc +++ b/gcc/fortran/trans-decl.cc @@ -7648,7 +7648,7 @@ gfc_conv_cfi_to_gfc (stmtblock_t *init, stmtblock_t *finally, /* for (i = 1; i < rank; ++i) cond &&= dim[i].sm != (dv->dim[i - 1].sm * dv->dim[i - 1].extent) */ - idx = gfc_create_var (TREE_TYPE (rank), "idx"); + idx = gfc_create_var (gfc_dim_iter_type_node, "idx"); stmtblock_t loop_body; gfc_init_block (&loop_body); tmp = fold_build2_loc (input_location, MINUS_EXPR, TREE_TYPE (idx), @@ -7713,7 +7713,7 @@ gfc_conv_cfi_to_gfc (stmtblock_t *init, stmtblock_t *finally, gfc_add_modify (&loop_body, tmpidx, idx); stmtblock_t inner_loop; gfc_init_block (&inner_loop); - tree dim = gfc_create_var (TREE_TYPE (rank), "dim"); + tree dim = gfc_create_var (gfc_dim_iter_type_node, "dim"); /* shift += (tmpidx % extent[d]) * sm[d] */ tmp = fold_build2_loc (input_location, TRUNC_MOD_EXPR, size_type_node, tmpidx, @@ -7731,7 +7731,7 @@ gfc_conv_cfi_to_gfc (stmtblock_t *init, stmtblock_t *finally, gfc_add_modify (&inner_loop, tmpidx, fold_build2_loc (input_location, TRUNC_DIV_EXPR, size_type_node, tmpidx, tmp)); - gfc_simple_for_loop (&loop_body, dim, build_zero_cst (TREE_TYPE (rank)), + gfc_simple_for_loop (&loop_body, dim, build_zero_cst (TREE_TYPE (dim)), rank, LT_EXPR, build_int_cst (TREE_TYPE (dim), 1), gfc_finish_block (&inner_loop)); /* Assign. */ @@ -7816,7 +7816,7 @@ gfc_conv_cfi_to_gfc (stmtblock_t *init, stmtblock_t *finally, } /* Loop: for (i = 0; i < rank; ++i). */ - idx = gfc_create_var (TREE_TYPE (rank), "idx"); + idx = gfc_create_var (gfc_dim_iter_type_node, "idx"); /* Loop body. */ stmtblock_t loop_body; @@ -7952,7 +7952,7 @@ done: gfc_add_modify (&loop_body, tmpidx, idx); stmtblock_t inner_loop; gfc_init_block (&inner_loop); - tree dim = gfc_create_var (TREE_TYPE (rank), "dim"); + tree dim = gfc_create_var (gfc_dim_iter_type_node, "dim"); /* shift += (tmpidx % extent[d]) * sm[d] */ tmp = fold_convert (size_type_node, gfc_get_cfi_dim_extent (cfi, dim)); @@ -7972,7 +7972,7 @@ done: fold_build2_loc (input_location, TRUNC_DIV_EXPR, size_type_node, tmpidx, tmp)); gfc_simple_for_loop (&loop_body, dim, - build_zero_cst (TREE_TYPE (rank)), rank, LT_EXPR, + build_zero_cst (TREE_TYPE (dim)), rank, LT_EXPR, build_int_cst (TREE_TYPE (dim), 1), gfc_finish_block (&inner_loop)); /* Assign. */ @@ -8041,7 +8041,7 @@ done: gfc_init_block (&block2); /* Loop: for (i = 0; i < rank; ++i). */ - idx = gfc_create_var (TREE_TYPE (rank), "idx"); + idx = gfc_create_var (gfc_dim_iter_type_node, "idx"); /* Loop body. */ gfc_init_block (&loop_body); diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc index bad0786f47aa..676321baea88 100644 --- a/gcc/fortran/trans-expr.cc +++ b/gcc/fortran/trans-expr.cc @@ -6255,7 +6255,7 @@ gfc_conv_gfc_desc_to_cfi_desc (gfc_se *parmse, gfc_expr *e, gfc_symbol *fsym) rank = fold_convert (signed_char_type_node, gfc_conv_descriptor_rank_get (gfc)); else - rank = build_int_cst (signed_char_type_node, e->rank); + rank = build_int_cst (gfc_rank_type_node, e->rank); tmp = gfc_get_cfi_desc_rank (cfi); gfc_add_modify (&block, tmp, rank); int itype = CFI_type_other; @@ -6467,7 +6467,7 @@ gfc_conv_gfc_desc_to_cfi_desc (gfc_se *parmse, gfc_expr *e, gfc_symbol *fsym) if (e->rank != 0) { /* Loop: for (i = 0; i < rank; ++i). */ - tree idx = gfc_create_var (TREE_TYPE (rank), "idx"); + tree idx = gfc_create_var (gfc_dim_iter_type_node, "idx"); /* Loop body. */ stmtblock_t loop_body; gfc_init_block (&loop_body); @@ -6576,7 +6576,7 @@ done: /* Calculate offset + set lbound, ubound and stride. */ gfc_conv_descriptor_offset_set (&block2, gfc, gfc_index_zero_node); /* Loop: for (i = 0; i < rank; ++i). */ - tree idx = gfc_create_var (TREE_TYPE (rank), "idx"); + tree idx = gfc_create_var (gfc_dim_iter_type_node, "idx"); /* Loop body. */ stmtblock_t loop_body; gfc_init_block (&loop_body); diff --git a/gcc/fortran/trans-types.cc b/gcc/fortran/trans-types.cc index 9ecf034d34a6..c690997256c1 100644 --- a/gcc/fortran/trans-types.cc +++ b/gcc/fortran/trans-types.cc @@ -68,6 +68,8 @@ tree logical_type_node; tree logical_true_node; tree logical_false_node; tree gfc_charlen_type_node; +tree gfc_rank_type_node; +tree gfc_dim_iter_type_node; tree gfc_float128_type_node = NULL_TREE; tree gfc_complex_float128_type_node = NULL_TREE; @@ -164,7 +166,7 @@ tree get_dtype_type_node (void) suppress_warning (field); field = gfc_add_field_to_struct_1 (dtype_node, get_identifier ("rank"), - signed_char_type_node, &dtype_chain); + gfc_rank_type_node, &dtype_chain); suppress_warning (field); field = gfc_add_field_to_struct_1 (dtype_node, get_identifier ("type"), @@ -1226,6 +1228,17 @@ gfc_init_types (void) gfc_charlen_int_kind = get_int_kind_from_node (size_type_node); gfc_charlen_type_node = gfc_get_int_type (gfc_charlen_int_kind); + gfc_rank_type_node = build_range_type (signed_char_type_node, + build_zero_cst (signed_char_type_node), + build_int_cst (signed_char_type_node, + GFC_MAX_DIMENSIONS)); + + gfc_dim_iter_type_node + = build_range_type (signed_char_type_node, + build_minus_one_cst (signed_char_type_node), + build_int_cst (signed_char_type_node, + GFC_MAX_DIMENSIONS + 1)); + /* Fortran kind number of size_type_node (size_t). This is used for the _size member in vtables. */ gfc_size_kind = get_int_kind_from_node (size_type_node); diff --git a/gcc/fortran/trans-types.h b/gcc/fortran/trans-types.h index 94fa6761e902..a2bbc1bcde8d 100644 --- a/gcc/fortran/trans-types.h +++ b/gcc/fortran/trans-types.h @@ -52,6 +52,16 @@ extern GTY(()) tree logical_false_node; It must be the same as the corresponding definition in gfortran.h. */ extern GTY(()) tree gfc_charlen_type_node; +/* An integral type with bounds [0, GFC_MAX_DIMENSIONS] suitable to hold an + array rank. */ +extern GTY(()) tree gfc_rank_type_node; + +/* This is the same as gfc_rank_type_node, except the range is extended by one + unit in both directions. This type is suitable for indexes to iterate over + array dimensions. GFC_RANK_TYPE_NODE can't be used for them, because a + stop condition such as I < GFC_MAX_DIMENSIONS would be eliminated as always + true if I had type GFC_RANK_TYPE_NODE. */ +extern GTY(()) tree gfc_dim_iter_type_node; /* The following flags give us information on the correspondence of real (and complex) kinds with C floating-point types long double
