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

Reply via email to