https://gcc.gnu.org/g:88fd33a12fae9933206a1816455e5a69b671cd98

commit 88fd33a12fae9933206a1816455e5a69b671cd98
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Sun Jun 29 14:28:16 2025 +0200

    Suppression gfc_conv_descriptor_dimension compil' OK

Diff:
---
 gcc/fortran/trans-array.cc      | 10 +++++-----
 gcc/fortran/trans-descriptor.cc | 33 ++++++++++++++++++++++++++++++---
 gcc/fortran/trans-descriptor.h  |  5 ++++-
 3 files changed, 39 insertions(+), 9 deletions(-)

diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index 5a05031d3b69..af0736300cb5 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -8828,11 +8828,11 @@ gfc_conv_array_parameter (gfc_se *se, gfc_expr *expr, 
bool g77,
 
              for (int i = 0; i < expr->rank; i++)
                {
-                 old_field = gfc_conv_descriptor_dimension (old_desc,
-                       gfc_rank_cst[get_array_ref_dim_for_loop_dim (ss, i)]);
-                 new_field = gfc_conv_descriptor_dimension (new_desc,
-                       gfc_rank_cst[i]);
-                 gfc_add_modify (&se->pre, new_field, old_field);
+                 int idx = get_array_ref_dim_for_loop_dim (ss, i);
+                 old_field = gfc_conv_descriptor_dimension_get (old_desc, idx);
+                 gfc_conv_descriptor_dimension_set (&se->pre, new_desc, i,
+                                                    old_field);
+                                                     
                }
 
              if (flag_coarray == GFC_FCOARRAY_LIB
diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc
index 9f7f50788f65..a05fc1b4b573 100644
--- a/gcc/fortran/trans-descriptor.cc
+++ b/gcc/fortran/trans-descriptor.cc
@@ -414,8 +414,8 @@ gfc_get_descriptor_dimension (tree desc)
 }
 
 
-tree
-gfc_conv_descriptor_dimension (tree desc, tree dim)
+static tree
+get_descriptor_dimension (tree desc, tree dim)
 {
   tree tmp;
 
@@ -424,6 +424,33 @@ gfc_conv_descriptor_dimension (tree desc, tree dim)
   return gfc_build_array_ref (tmp, dim, NULL_TREE, true);
 }
 
+tree
+gfc_conv_descriptor_dimension_get (tree desc, tree dim)
+{
+  return non_lvalue_loc (input_location, get_descriptor_dimension (desc, dim));
+}
+
+tree
+gfc_conv_descriptor_dimension_get (tree desc, int dim)
+{
+  return gfc_conv_descriptor_dimension_get (desc, gfc_rank_cst[dim]);
+}
+
+void
+gfc_conv_descriptor_dimension_set (stmtblock_t *block, tree desc, tree dim,
+                                  tree value)
+{
+  tree t = get_descriptor_dimension (desc, dim);
+  gfc_add_modify (block, t, fold_convert (TREE_TYPE (t), value));
+}
+
+void
+gfc_conv_descriptor_dimension_set (stmtblock_t *block, tree desc, int dim,
+                                  tree value)
+{
+  gfc_conv_descriptor_dimension_set (block, desc, gfc_rank_cst[dim], value);
+}
+
 
 tree
 gfc_conv_descriptor_token (tree desc)
@@ -439,7 +466,7 @@ gfc_conv_descriptor_token (tree desc)
 static tree
 gfc_conv_descriptor_subfield (tree desc, tree dim, unsigned field_idx)
 {
-  tree tmp = gfc_conv_descriptor_dimension (desc, dim);
+  tree tmp = get_descriptor_dimension (desc, dim);
   tree field = gfc_advance_chain (TYPE_FIELDS (TREE_TYPE (tmp)), field_idx);
   gcc_assert (field != NULL_TREE);
 
diff --git a/gcc/fortran/trans-descriptor.h b/gcc/fortran/trans-descriptor.h
index 708a340e66d5..d313d9fab175 100644
--- a/gcc/fortran/trans-descriptor.h
+++ b/gcc/fortran/trans-descriptor.h
@@ -30,7 +30,6 @@ tree gfc_get_cfi_dim_sm (tree desc, tree idx);
 
 
 tree gfc_get_descriptor_dimension (tree desc);
-tree gfc_conv_descriptor_dimension (tree desc, tree dim);
 tree gfc_conv_descriptor_token (tree desc);
 
 tree gfc_conv_descriptor_data_get (tree desc);
@@ -42,6 +41,8 @@ tree gfc_conv_descriptor_rank_get (tree desc);
 tree gfc_conv_descriptor_type_get (tree desc);
 tree gfc_conv_descriptor_span_get (tree desc);
 
+tree gfc_conv_descriptor_dimension_get (tree desc, tree dim);
+tree gfc_conv_descriptor_dimension_get (tree desc, int dim);
 tree gfc_conv_descriptor_stride_get (tree desc, tree dim);
 tree gfc_conv_descriptor_lbound_get (tree desc, tree dim);
 tree gfc_conv_descriptor_ubound_get (tree desc, tree dim);
@@ -55,6 +56,8 @@ void gfc_conv_descriptor_version_set (stmtblock_t *block, 
tree desc, tree value)
 void gfc_conv_descriptor_rank_set (stmtblock_t *block, tree desc, tree value);
 void gfc_conv_descriptor_rank_set (stmtblock_t *block, tree desc, int value);
 void gfc_conv_descriptor_span_set (stmtblock_t *block, tree desc, tree value);
+void gfc_conv_descriptor_dimension_set (stmtblock_t *block, tree desc, tree 
dim, tree value);
+void gfc_conv_descriptor_dimension_set (stmtblock_t *block, tree desc, int 
dim, tree value);
 void gfc_conv_descriptor_stride_set (stmtblock_t *block, tree desc, tree dim, 
tree value);
 void gfc_conv_descriptor_lbound_set (stmtblock_t *block, tree desc, tree dim, 
tree value);
 void gfc_conv_descriptor_ubound_set (stmtblock_t *block, tree desc, tree dim, 
tree value);

Reply via email to