https://gcc.gnu.org/g:4696d2d4523e40e27d394d8274182f3f38e5844d

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

    Suppression gfc_conv_descriptor_elem_len compil' OK
    
    Correction ICE class_allocate_21
    
    Suppression non_lvalue elem_len_get
    
    Ajout location elem_len_set
    
    Suppression retour à la ligne inutile elem_len_set

Diff:
---
 gcc/fortran/trans-array.cc      |  8 ++------
 gcc/fortran/trans-decl.cc       | 10 +++++-----
 gcc/fortran/trans-descriptor.cc | 18 ++++++++++++++++--
 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, 32 insertions(+), 21 deletions(-)

diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index 23e3a64d04c8..7218df21885e 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -5838,11 +5838,7 @@ 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, expr3_elem_size);
   else
     gfc_conv_descriptor_dtype_set (pblock, descriptor, gfc_get_dtype (type));
 
@@ -11202,7 +11198,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 34a71cfda5d4..ea4817d1cc16 100644
--- a/gcc/fortran/trans-descriptor.cc
+++ b/gcc/fortran/trans-descriptor.cc
@@ -316,8 +316,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;
@@ -331,6 +331,20 @@ gfc_conv_descriptor_elem_len (tree desc)
                          dtype, tmp, NULL_TREE);
 }
 
+tree
+gfc_conv_descriptor_elem_len_get (tree desc)
+{
+  return get_descriptor_elem_len (desc);
+}
+
+void
+gfc_conv_descriptor_elem_len_set (stmtblock_t *block, tree desc, tree value)
+{
+  location_t loc = input_location;
+  tree t = get_descriptor_elem_len (desc);
+  gfc_add_modify_loc (loc, block, t,
+                     fold_convert_loc (loc, 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 108d15bec7ec..8cd65b46f5fa 100644
--- a/gcc/fortran/trans-descriptor.h
+++ b/gcc/fortran/trans-descriptor.h
@@ -50,7 +50,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);
@@ -60,6 +59,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);
@@ -70,6 +70,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 5343e3c532c4..f6bb5dd8bfba 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().  */
@@ -6215,7 +6215,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));
     }
@@ -6230,7 +6230,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 bc2e40e96620..c8c49984944c 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 726f3da65235..886f9d7d97db 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