https://gcc.gnu.org/g:fd1664f096e16e3fde4bba8b7d9ef20f8070f7c9

commit fd1664f096e16e3fde4bba8b7d9ef20f8070f7c9
Author: Mikael Morin <[email protected]>
Date:   Fri Jun 26 13:57:55 2026 +0200

    Sauvegarde openacc.f90 compil' OK

Diff:
---
 gcc/fortran/trans-array.cc      | 22 ++++++++++++----------
 gcc/fortran/trans-const.cc      |  5 +++++
 gcc/fortran/trans-const.h       |  5 +++--
 gcc/fortran/trans-decl.cc       | 14 +++++++-------
 gcc/fortran/trans-descriptor.cc |  2 +-
 gcc/fortran/trans-expr.cc       | 15 ++++++++-------
 gcc/fortran/trans-openmp.cc     | 11 ++++++-----
 gcc/fortran/trans-types.cc      |  8 ++++----
 gcc/fortran/trans-types.h       | 11 +++++------
 9 files changed, 51 insertions(+), 42 deletions(-)

diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index eef65622420b..c88b4a663541 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -8579,15 +8579,15 @@ gfc_tree_array_size (stmtblock_t *block, tree desc, 
gfc_expr *expr, tree dim)
   gcc_assert (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (desc)));
   enum gfc_array_kind akind = GFC_TYPE_ARRAY_AKIND (TREE_TYPE (desc));
   if (expr == NULL || expr->rank < 0)
-    rank = fold_convert (signed_char_type_node,
+    rank = fold_convert (gfc_dim_index_type_node,
                         gfc_conv_descriptor_rank_get (desc));
   else
-    rank = build_int_cst (signed_char_type_node, expr->rank);
+    rank = build_int_cst (gfc_dim_index_type_node, expr->rank);
 
   if (dim || (expr && expr->rank == 1))
     {
       if (!dim)
-       dim = gfc_index_zero_node;
+       dim = gfc_rank_cst[1];
       tree ubound = gfc_conv_descriptor_ubound_get (desc, dim);
       tree lbound = gfc_conv_descriptor_lbound_get (desc, dim);
 
@@ -8604,10 +8604,11 @@ gfc_tree_array_size (stmtblock_t *block, tree desc, 
gfc_expr *expr, tree dim)
       if (akind == GFC_ARRAY_ASSUMED_RANK_CONT
          || akind == GFC_ARRAY_ASSUMED_RANK)
        {
-         tmp = fold_build2_loc (input_location, MINUS_EXPR, 
signed_char_type_node,
-                                rank, build_int_cst (signed_char_type_node, 
1));
+         tmp = fold_build2_loc (input_location, MINUS_EXPR,
+                                gfc_dim_index_type_node, rank,
+                                build_int_cst (gfc_dim_index_type_node, 1));
          cond = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node,
-                                 fold_convert (signed_char_type_node, dim),
+                                 fold_convert (gfc_dim_index_type_node, dim),
                                  tmp);
          tmp = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node,
                                 gfc_conv_descriptor_ubound_get (desc, dim),
@@ -8631,7 +8632,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 (gfc_dim_iter_type_node, "idx");
+  tree idx = gfc_create_var (gfc_dim_index_type_node, "idx");
   /* Loop body.  */
   /* #if (assumed-rank + !allocatable && !pointer)
        if (idx == rank - 1 && dim[idx].ubound == -1)
@@ -8645,8 +8646,9 @@ gfc_tree_array_size (stmtblock_t *block, tree desc, 
gfc_expr *expr, tree dim)
   cond = NULL_TREE;
   if (akind == GFC_ARRAY_ASSUMED_RANK_CONT || akind == GFC_ARRAY_ASSUMED_RANK)
     {
-      tmp = fold_build2_loc (input_location, MINUS_EXPR, signed_char_type_node,
-                            rank, build_int_cst (signed_char_type_node, 1));
+      tmp = fold_build2_loc (input_location, MINUS_EXPR,
+                            gfc_dim_index_type_node, rank,
+                            build_int_cst (gfc_dim_index_type_node, 1));
       cond = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node,
                                  idx, tmp);
       tmp = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node,
@@ -9179,7 +9181,7 @@ gfc_conv_array_parameter (gfc_se *se, gfc_expr *expr, 
bool g77,
 
              if (expr->rank == -1)
                {
-                 tree idx = gfc_create_var (signed_char_type_node, "idx");
+                 tree idx = gfc_create_var (gfc_dim_index_type_node, "idx");
                  tree stride = gfc_create_var (gfc_array_index_type, "stride");
                  stmtblock_t loop_body;
 
diff --git a/gcc/fortran/trans-const.cc b/gcc/fortran/trans-const.cc
index 34fd39a903f1..3b30b1023dd8 100644
--- a/gcc/fortran/trans-const.cc
+++ b/gcc/fortran/trans-const.cc
@@ -35,6 +35,8 @@ along with GCC; see the file COPYING3.  If not see
 #include "target-memory.h"
 
 tree gfc_rank_cst[GFC_MAX_DIMENSIONS + 1];
+tree gfc_index_zero_node;
+tree gfc_index_one_node;
 
 /* Build a constant with given type from an int_cst.  */
 
@@ -195,6 +197,9 @@ gfc_init_constants (void)
 
   for (n = 0; n <= GFC_MAX_DIMENSIONS; n++)
     gfc_rank_cst[n] = build_int_cst (gfc_rank_type_node, n);
+
+  gfc_index_zero_node = build_zero_cst (gfc_array_index_type);
+  gfc_index_one_node = build_one_cst (gfc_array_index_type);
 }
 
 /* Converts a GMP integer into a backend tree node.  */
diff --git a/gcc/fortran/trans-const.h b/gcc/fortran/trans-const.h
index eb268cced40a..abd7d7694518 100644
--- a/gcc/fortran/trans-const.h
+++ b/gcc/fortran/trans-const.h
@@ -65,5 +65,6 @@ tree gfc_build_const (tree, tree);
 /* Integer constants 0..GFC_MAX_DIMENSIONS.  */
 extern GTY(()) tree gfc_rank_cst[GFC_MAX_DIMENSIONS + 1];
 
-#define gfc_index_zero_node gfc_rank_cst[0]
-#define gfc_index_one_node gfc_rank_cst[1]
+/* Integer constants 0 and 1, of array index type.  */
+extern GTY(()) tree gfc_index_zero_node;
+extern GTY(()) tree gfc_index_one_node;
diff --git a/gcc/fortran/trans-decl.cc b/gcc/fortran/trans-decl.cc
index ee7453354964..b2fc68ad38f5 100644
--- a/gcc/fortran/trans-decl.cc
+++ b/gcc/fortran/trans-decl.cc
@@ -7357,7 +7357,7 @@ gfc_conv_cfi_to_gfc (stmtblock_t *init, stmtblock_t 
*finally,
          tmp3 = tmp2 = tmp = gfc_get_cfi_desc_rank (cfi);
          if (sym->as->rank != -1)
            tmp = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
-                                  tmp, build_int_cst (signed_char_type_node,
+                                  tmp, build_int_cst (gfc_rank_type_node,
                                                       sym->as->rank));
          else
            {
@@ -7601,7 +7601,7 @@ gfc_conv_cfi_to_gfc (stmtblock_t *init, stmtblock_t 
*finally,
     /* In that case, the CFI rank and the declared rank can differ.  */
     rank = gfc_get_cfi_desc_rank (cfi);
   else
-    rank = build_int_cst (signed_char_type_node, sym->as->rank);
+    rank = build_int_cst (gfc_rank_type_node, sym->as->rank);
 
   /* With bind(C), the standard requires that both Fortran callers and callees
      handle noncontiguous arrays passed to an dummy with 'contiguous' attribute
@@ -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 (gfc_dim_iter_type_node, "idx");
+      idx = gfc_create_var (gfc_dim_index_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 (gfc_dim_iter_type_node, "dim");
+      tree dim = gfc_create_var (gfc_dim_index_type_node, "dim");
       /* shift += (tmpidx % extent[d]) * sm[d] */
       tmp = fold_build2_loc (input_location, TRUNC_MOD_EXPR,
                             size_type_node, tmpidx,
@@ -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 (gfc_dim_iter_type_node, "idx");
+  idx = gfc_create_var (gfc_dim_index_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 (gfc_dim_iter_type_node, "dim");
+         tree dim = gfc_create_var (gfc_dim_index_type_node, "dim");
          /* shift += (tmpidx % extent[d]) * sm[d] */
          tmp = fold_convert (size_type_node,
                              gfc_get_cfi_dim_extent (cfi, dim));
@@ -8041,7 +8041,7 @@ done:
   gfc_init_block (&block2);
 
   /* Loop: for (i = 0; i < rank; ++i).  */
-  idx = gfc_create_var (gfc_dim_iter_type_node, "idx");
+  idx = gfc_create_var (gfc_dim_index_type_node, "idx");
 
   /* Loop body.  */
   gfc_init_block (&loop_body);
diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc
index cbb59c6a16fa..b981eb1bfd56 100644
--- a/gcc/fortran/trans-descriptor.cc
+++ b/gcc/fortran/trans-descriptor.cc
@@ -208,7 +208,7 @@ conv_descriptor_rank (tree desc)
   dtype = conv_descriptor_dtype (desc);
   tmp = gfc_advance_chain (TYPE_FIELDS (TREE_TYPE (dtype)), GFC_DTYPE_RANK);
   gcc_assert (tmp != NULL_TREE
-             && TREE_TYPE (tmp) == signed_char_type_node);
+             && TREE_TYPE (tmp) == gfc_rank_type_node);
   return fold_build3_loc (input_location, COMPONENT_REF, TREE_TYPE (tmp),
                          dtype, tmp, NULL_TREE);
 }
diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index 676321baea88..ca0f2e5ba545 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -3403,10 +3403,11 @@ gfc_conv_variable (gfc_se * se, gfc_expr * expr)
       tree dim, lower, upper, cond;
       char *msg;
 
-      dim = fold_convert (signed_char_type_node,
+      dim = fold_convert (gfc_dim_index_type_node,
                          gfc_conv_descriptor_rank_get (se->expr));
-      dim = fold_build2_loc (input_location, MINUS_EXPR, signed_char_type_node,
-                            dim, build_int_cst (signed_char_type_node, 1));
+      dim = fold_build2_loc (input_location, MINUS_EXPR,
+                            gfc_dim_index_type_node, dim,
+                            build_int_cst (gfc_dim_index_type_node, 1));
       lower = gfc_conv_descriptor_lbound_get (se->expr, dim);
       upper = gfc_conv_descriptor_ubound_get (se->expr, dim);
 
@@ -6252,10 +6253,10 @@ gfc_conv_gfc_desc_to_cfi_desc (gfc_se *parmse, gfc_expr 
*e, gfc_symbol *fsym)
   gfc_add_modify (&block, tmp,
                  build_int_cst (TREE_TYPE (tmp), CFI_VERSION));
   if (e->rank < 0)
-    rank = fold_convert (signed_char_type_node,
+    rank = fold_convert (gfc_dim_index_type_node,
                         gfc_conv_descriptor_rank_get (gfc));
   else
-    rank = build_int_cst (gfc_rank_type_node, e->rank);
+    rank = build_int_cst (gfc_dim_index_type_node, e->rank);
   tmp = gfc_get_cfi_desc_rank (cfi);
   gfc_add_modify (&block, tmp, rank);
   int itype = CFI_type_other;
@@ -6467,7 +6468,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 (gfc_dim_iter_type_node, "idx");
+      tree idx = gfc_create_var (gfc_dim_index_type_node, "idx");
       /* Loop body.  */
       stmtblock_t loop_body;
       gfc_init_block (&loop_body);
@@ -6576,7 +6577,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 (gfc_dim_iter_type_node, "idx");
+      tree idx = gfc_create_var (gfc_dim_index_type_node, "idx");
       /* Loop body.  */
       stmtblock_t loop_body;
       gfc_init_block (&loop_body);
diff --git a/gcc/fortran/trans-openmp.cc b/gcc/fortran/trans-openmp.cc
index f209a7b8d2b9..eccdf47bd3fd 100644
--- a/gcc/fortran/trans-openmp.cc
+++ b/gcc/fortran/trans-openmp.cc
@@ -2123,17 +2123,18 @@ gfc_omp_get_array_size (location_t loc, tree desc, 
gimple_seq *seq)
   tree extent = build_decl (loc, VAR_DECL, create_tmp_var_name ("extent"),
                            gfc_array_index_type);
   tree idx = build_decl (loc, VAR_DECL, create_tmp_var_name ("idx"),
-                        signed_char_type_node);
+                        gfc_dim_index_type_node);
 
-  tree begin = build_zero_cst (signed_char_type_node);
+  tree begin = build_zero_cst (gfc_dim_index_type_node);
   tree end;
   if (GFC_TYPE_ARRAY_AKIND (TREE_TYPE (desc)) == GFC_ARRAY_ASSUMED_SHAPE_CONT
       || GFC_TYPE_ARRAY_AKIND (TREE_TYPE (desc)) == GFC_ARRAY_ASSUMED_SHAPE)
-    end = gfc_conv_descriptor_rank_get (desc);
+    end = fold_convert (gfc_dim_index_type_node,
+                       gfc_conv_descriptor_rank_get (desc));
   else
-    end = build_int_cst (signed_char_type_node,
+    end = build_int_cst (gfc_dim_index_type_node,
                         GFC_TYPE_ARRAY_RANK (TREE_TYPE (desc)));
-  tree step = build_int_cst (signed_char_type_node, 1);
+  tree step = build_int_cst (gfc_dim_index_type_node, 1);
 
   /* size = 0
      for (idx = 0; idx < rank; idx++)
diff --git a/gcc/fortran/trans-types.cc b/gcc/fortran/trans-types.cc
index c690997256c1..399e1daf9677 100644
--- a/gcc/fortran/trans-types.cc
+++ b/gcc/fortran/trans-types.cc
@@ -69,7 +69,7 @@ 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_dim_index_type_node;
 
 tree gfc_float128_type_node = NULL_TREE;
 tree gfc_complex_float128_type_node = NULL_TREE;
@@ -1233,11 +1233,11 @@ gfc_init_types (void)
                                         build_int_cst (signed_char_type_node,
                                                        GFC_MAX_DIMENSIONS));
 
-  gfc_dim_iter_type_node
+  gfc_dim_index_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));
+                                          GFC_MAX_DIMENSIONS));
 
   /* Fortran kind number of size_type_node (size_t). This is used for
      the _size member in vtables.  */
@@ -4161,7 +4161,7 @@ gfc_get_cfi_type (int dimen, bool restricted)
                                     integer_type_node, &chain);
   suppress_warning (field);
   field = gfc_add_field_to_struct_1 (CFI_cdesc_t, get_identifier ("rank"),
-                                    signed_char_type_node, &chain);
+                                    gfc_rank_type_node, &chain);
   suppress_warning (field);
   field = gfc_add_field_to_struct_1 (CFI_cdesc_t, get_identifier ("attribute"),
                                     signed_char_type_node, &chain);
diff --git a/gcc/fortran/trans-types.h b/gcc/fortran/trans-types.h
index a2bbc1bcde8d..4786b4d2d268 100644
--- a/gcc/fortran/trans-types.h
+++ b/gcc/fortran/trans-types.h
@@ -56,12 +56,11 @@ extern GTY(()) tree gfc_charlen_type_node;
    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;
+/* An integral type suitable to hold an array dimension index. This type is the
+   same as gfc_rank_type_node above, except its range is extended to include 
the
+   value -1.  Including -1 is necessary for downward stepping loops to avoid
+   eliminating the I < 0 exit condition as always false.  */
+extern GTY(()) tree gfc_dim_index_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