https://gcc.gnu.org/g:4f4d8259a58d93480f46b4911a6f0a41cc31b85b

commit 4f4d8259a58d93480f46b4911a6f0a41cc31b85b
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Sun Jun 29 12:40:53 2025 +0200

    Suppression gfc_conv_descriptor_elem_len compil' OK

Diff:
---
 gcc/fortran/trans-array.cc      | 10 ++++------
 gcc/fortran/trans-decl.cc       | 10 +++++-----
 gcc/fortran/trans-descriptor.cc | 17 +++++++++++++++--
 gcc/fortran/trans-descriptor.h  |  3 ++-
 gcc/fortran/trans-expr.cc       |  6 +++---
 gcc/fortran/trans-intrinsic.cc  |  2 +-
 gcc/fortran/trans-openmp.cc     |  6 +++---
 7 files changed, 33 insertions(+), 21 deletions(-)

diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index 6ba9e3dd05ef..861872303d18 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -5673,11 +5673,9 @@ gfc_array_init_size (tree descriptor, int rank, int 
corank, tree * poffset,
   else if (expr->ts.type == BT_CLASS && !explicit_ts
           && expr3 && expr3->ts.type != BT_CLASS
           && expr3_elem_size != NULL_TREE && expr3_desc == NULL_TREE)
-    {
-      tmp = gfc_conv_descriptor_elem_len (descriptor);
-      gfc_add_modify (pblock, tmp,
-                     fold_convert (TREE_TYPE (tmp), expr3_elem_size));
-    }
+    gfc_conv_descriptor_elem_len_set (pblock, descriptor,
+                                     fold_convert (TREE_TYPE (tmp),
+                                                   expr3_elem_size));
   else
     gfc_conv_descriptor_dtype_set (pblock, descriptor, gfc_get_dtype (type));
 
@@ -10941,7 +10939,7 @@ gfc_alloc_allocatable_for_assignment (gfc_loopinfo 
*loop,
     {
       /* Unfortunately, the lhs vptr is set too early in many cases.
         Play it safe by using the descriptor element length.  */
-      tmp = gfc_conv_descriptor_elem_len (desc);
+      tmp = gfc_conv_descriptor_elem_len_get (desc);
       elemsize1 = fold_convert (gfc_array_index_type, tmp);
     }
   else
diff --git a/gcc/fortran/trans-decl.cc b/gcc/fortran/trans-decl.cc
index e448f37820e1..c89047acdcc8 100644
--- a/gcc/fortran/trans-decl.cc
+++ b/gcc/fortran/trans-decl.cc
@@ -7276,8 +7276,8 @@ gfc_conv_cfi_to_gfc (stmtblock_t *init, stmtblock_t 
*finally,
   if (sym->ts.type == BT_ASSUMED)
     {
       /* For type(*), take elem_len + dtype.type from the actual argument.  */
-      gfc_add_modify (&block, gfc_conv_descriptor_elem_len (gfc_desc),
-                     gfc_get_cfi_desc_elem_len (cfi));
+      gfc_conv_descriptor_elem_len_set (&block, gfc_desc,
+                                       gfc_get_cfi_desc_elem_len (cfi));
       tree cond;
       tree ctype = gfc_get_cfi_desc_type (cfi);
       ctype = fold_build2_loc (input_location, BIT_AND_EXPR, TREE_TYPE (ctype),
@@ -7507,7 +7507,7 @@ gfc_conv_cfi_to_gfc (stmtblock_t *init, stmtblock_t 
*finally,
       /* memcpy (lhs + idx*elem_len, rhs + shift, elem_len)  */
       tree elem_len;
       if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (gfc_desc)))
-       elem_len = gfc_conv_descriptor_elem_len (gfc_desc);
+       elem_len = gfc_conv_descriptor_elem_len_get (gfc_desc);
       else
        elem_len = gfc_get_cfi_desc_elem_len (cfi);
       lhs = fold_build2_loc (input_location, MULT_EXPR, size_type_node,
@@ -7545,7 +7545,7 @@ gfc_conv_cfi_to_gfc (stmtblock_t *init, stmtblock_t 
*finally,
   /* if do_copy_inout:  gfc->dspan = gfc->dtype.elem_len
      We use gfc instead of cfi on the RHS as this might be a constant.  */
   tmp = fold_convert (gfc_array_index_type,
-                     gfc_conv_descriptor_elem_len (gfc_desc));
+                     gfc_conv_descriptor_elem_len_get (gfc_desc));
   if (!do_copy_inout)
     {
       /* gfc->dspan = ((cfi->dim[0].sm % gfc->elem_len)
@@ -7749,7 +7749,7 @@ done:
          /* memcpy (lhs + shift, rhs + idx*elem_len, elem_len) */
          tree elem_len;
          if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (gfc_desc)))
-           elem_len = gfc_conv_descriptor_elem_len (gfc_desc);
+           elem_len = gfc_conv_descriptor_elem_len_get (gfc_desc);
          else
            elem_len = gfc_get_cfi_desc_elem_len (cfi);
          rhs = fold_build2_loc (input_location, MULT_EXPR, size_type_node,
diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc
index cf10bbf0baef..0956343aad92 100644
--- a/gcc/fortran/trans-descriptor.cc
+++ b/gcc/fortran/trans-descriptor.cc
@@ -315,8 +315,8 @@ gfc_conv_descriptor_version (tree desc)
 
 /* Return the element length from the descriptor dtype field.  */
 
-tree
-gfc_conv_descriptor_elem_len (tree desc)
+static tree
+get_descriptor_elem_len (tree desc)
 {
   tree tmp;
   tree dtype;
@@ -330,6 +330,19 @@ gfc_conv_descriptor_elem_len (tree desc)
                          dtype, tmp, NULL_TREE);
 }
 
+tree
+gfc_conv_descriptor_elem_len_get (tree desc)
+{
+  return non_lvalue_loc (input_location, get_descriptor_elem_len (desc));
+}
+
+void
+gfc_conv_descriptor_elem_len_set (stmtblock_t *block, tree desc,
+                               tree value)
+{
+  tree t = get_descriptor_elem_len (desc);
+  gfc_add_modify (block, t, fold_convert (TREE_TYPE (t), value));
+}
 
 tree
 gfc_conv_descriptor_attribute (tree desc)
diff --git a/gcc/fortran/trans-descriptor.h b/gcc/fortran/trans-descriptor.h
index 75bc74afeeb2..6149dc295ed5 100644
--- a/gcc/fortran/trans-descriptor.h
+++ b/gcc/fortran/trans-descriptor.h
@@ -31,7 +31,6 @@ tree gfc_get_cfi_dim_sm (tree desc, tree idx);
 
 tree gfc_conv_descriptor_rank (tree desc);
 tree gfc_conv_descriptor_version (tree desc);
-tree gfc_conv_descriptor_elem_len (tree desc);
 tree gfc_conv_descriptor_attribute (tree desc);
 tree gfc_conv_descriptor_type (tree desc);
 tree gfc_get_descriptor_dimension (tree desc);
@@ -41,6 +40,7 @@ tree gfc_conv_descriptor_token (tree desc);
 tree gfc_conv_descriptor_data_get (tree desc);
 tree gfc_conv_descriptor_offset_get (tree desc);
 tree gfc_conv_descriptor_dtype_get (tree desc);
+tree gfc_conv_descriptor_elem_len_get (tree desc);
 tree gfc_conv_descriptor_span_get (tree desc);
 
 tree gfc_conv_descriptor_stride_get (tree desc, tree dim);
@@ -51,6 +51,7 @@ void gfc_conv_descriptor_data_set (stmtblock_t *block, tree 
desc, tree value);
 void gfc_conv_descriptor_data_set (stmtblock_t *block, tree desc, tree value);
 void gfc_conv_descriptor_offset_set (stmtblock_t *block, tree desc, tree 
value);
 void gfc_conv_descriptor_dtype_set (stmtblock_t *block, tree desc, tree value);
+void gfc_conv_descriptor_elem_len_set (stmtblock_t *block, tree desc, tree 
value);
 void gfc_conv_descriptor_span_set (stmtblock_t *block, tree desc, 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);
diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index dde7457a28b8..52587ecb8bad 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -130,7 +130,7 @@ gfc_conv_scalar_to_descriptor (gfc_se *se, tree scalar, 
symbol_attribute attr)
                                 gfc_get_dtype_rank_type (0, etype));
   gfc_conv_descriptor_data_set (&se->pre, desc, scalar);
   gfc_conv_descriptor_span_set (&se->pre, desc,
-                               gfc_conv_descriptor_elem_len (desc));
+                               gfc_conv_descriptor_elem_len_get (desc));
 
   /* Copy pointer address back - but only if it could have changed and
      if the actual argument is a pointer and not, e.g., NULL().  */
@@ -6214,7 +6214,7 @@ gfc_conv_gfc_desc_to_cfi_desc (gfc_se *parmse, gfc_expr 
*e, gfc_symbol *fsym)
     }
   else if (e->ts.type == BT_ASSUMED)
     {
-      tmp = gfc_conv_descriptor_elem_len (gfc);
+      tmp = gfc_conv_descriptor_elem_len_get (gfc);
       tmp2 = gfc_get_cfi_desc_elem_len (cfi);
       gfc_add_modify (&block2, tmp2, fold_convert (TREE_TYPE (tmp2), tmp));
     }
@@ -6229,7 +6229,7 @@ gfc_conv_gfc_desc_to_cfi_desc (gfc_se *parmse, gfc_expr 
*e, gfc_symbol *fsym)
       tree type = fold_convert (TREE_TYPE (ctype),
                                gfc_conv_descriptor_type (gfc));
       tree kind = fold_convert (TREE_TYPE (ctype),
-                               gfc_conv_descriptor_elem_len (gfc));
+                               gfc_conv_descriptor_elem_len_get (gfc));
       kind = fold_build2_loc (input_location, LSHIFT_EXPR, TREE_TYPE (type),
                              kind, build_int_cst (TREE_TYPE (type),
                                                   CFI_type_kind_shift));
diff --git a/gcc/fortran/trans-intrinsic.cc b/gcc/fortran/trans-intrinsic.cc
index b19ebd6c02d4..0030344a7161 100644
--- a/gcc/fortran/trans-intrinsic.cc
+++ b/gcc/fortran/trans-intrinsic.cc
@@ -8167,7 +8167,7 @@ gfc_conv_intrinsic_sizeof (gfc_se *se, gfc_expr *expr)
       if (POINTER_TYPE_P (TREE_TYPE (tmp)))
        tmp = build_fold_indirect_ref_loc (input_location, tmp);
 
-      tmp = gfc_conv_descriptor_elem_len (tmp);
+      tmp = gfc_conv_descriptor_elem_len_get (tmp);
 
       byte_size = fold_convert (gfc_array_index_type, tmp);
     }
diff --git a/gcc/fortran/trans-openmp.cc b/gcc/fortran/trans-openmp.cc
index a4ba948e47f6..5e0732b1035d 100644
--- a/gcc/fortran/trans-openmp.cc
+++ b/gcc/fortran/trans-openmp.cc
@@ -196,7 +196,7 @@ gfc_omp_array_size (tree decl, gimple_seq *pre_p)
   size = fold_convert (size_type_node, size);
   tree elemsz = gfc_get_element_type (TREE_TYPE (decl));
   if (TREE_CODE (elemsz) == ARRAY_TYPE && TYPE_STRING_FLAG (elemsz))
-    elemsz = gfc_conv_descriptor_elem_len (decl);
+    elemsz = gfc_conv_descriptor_elem_len_get (decl);
   else
     elemsz = TYPE_SIZE_UNIT (elemsz);
   size = fold_build2 (MULT_EXPR, size_type_node, size, elemsz);
@@ -2206,7 +2206,7 @@ gfc_omp_deep_mapping_item (bool is_cnt, bool do_copy, 
bool do_alloc_check,
          /* TODO: Optimization: Shouldn't this be an expr. const, except for
             deferred-length strings. (Cf. also below).  */
          elem_len = (poly ? gfc_class_vtab_size_get (class_decl)
-                          : gfc_conv_descriptor_elem_len (decl));
+                          : gfc_conv_descriptor_elem_len_get (decl));
          tmp = (POINTER_TYPE_P (TREE_TYPE (decl))
                 ? build_fold_indirect_ref (decl) : decl);
          size = gfc_omp_get_array_size (loc, tmp, seq);
@@ -2251,7 +2251,7 @@ gfc_omp_deep_mapping_item (bool is_cnt, bool do_copy, 
bool do_alloc_check,
        {
          if (elem_len == NULL_TREE)
            {
-             elem_len = gfc_conv_descriptor_elem_len (decl);
+             elem_len = gfc_conv_descriptor_elem_len_get (decl);
              size = fold_convert (size_type_node,
                                   gfc_omp_get_array_size (loc, decl, seq));
            }

Reply via email to