[gcc(refs/users/mikael/heads/refactor_descriptor_v291.01)] Refactoring gfc_nullify_descriptor/gfc_init_descriptor_variable

Mikael Morin via Gcc-cvs <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:fcad48bdbee0b592190b07f83bb7f7bbf7057088

commit fcad48bdbee0b592190b07f83bb7f7bbf7057088
Author: Mikael Morin <[email protected]>
Date:   Fri Jul 24 13:01:02 2026 +0200

    Refactoring gfc_nullify_descriptor/gfc_init_descriptor_variable

Diff:
---
 gcc/fortran/trans-descriptor.cc | 14 +++++++++++---
 gcc/fortran/trans-expr.cc       | 11 +++++++++--
 gcc/fortran/trans-types.cc      | 11 +++++++++--
 gcc/fortran/trans-types.h       |  1 +
 gcc/fortran/trans.h             |  1 +
 5 files changed, 31 insertions(+), 7 deletions(-)

diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc
index a703efdeab3d..3b2ffd91b1d0 100644
--- a/gcc/fortran/trans-descriptor.cc
+++ b/gcc/fortran/trans-descriptor.cc
@@ -908,7 +908,8 @@ gfc_init_static_descriptor (tree descr)
 
 
 void
-gfc_init_descriptor_variable (stmtblock_t *block, gfc_symbol *sym, gfc_expr *expr, tree descr)
+gfc_nullify_descriptor (stmtblock_t *block, gfc_symbol *sym, gfc_expr *expr,
+			tree descr, tree string_length)
 {
   symbol_attribute attr = gfc_symbol_attr (sym);
 
@@ -940,8 +941,15 @@ gfc_init_descriptor_variable (stmtblock_t *block, gfc_symbol *sym, gfc_expr *exp
     rank = -1;
 
   tree etype = gfc_get_element_type (TREE_TYPE (descr));
-  gfc_conv_descriptor_dtype_set (block, descr,
-				 gfc_get_dtype_rank_type (rank, etype));
+  tree dtype = gfc_get_dtype_rank_type_slen (rank, etype, string_length);
+  gfc_conv_descriptor_dtype_set (block, descr, dtype);
+}
+
+void
+gfc_init_descriptor_variable (stmtblock_t *block, gfc_symbol *sym,
+			      gfc_expr *expr, tree descr)
+{
+  return gfc_nullify_descriptor (block, sym, expr, descr, NULL_TREE);
 }
 
 
diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index 406189af1571..1ff68977d7de 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -66,7 +66,7 @@ gfc_get_character_len (tree type)
 /* Calculate the number of bytes in a string.  */
 
 tree
-gfc_get_character_len_in_bytes (tree type)
+gfc_get_character_len_in_bytes (tree type, tree slen)
 {
   tree tmp, len;
 
@@ -76,7 +76,7 @@ gfc_get_character_len_in_bytes (tree type)
   tmp = TYPE_SIZE_UNIT (TREE_TYPE (type));
   tmp = (tmp && !integer_zerop (tmp))
     ? (fold_convert (gfc_charlen_type_node, tmp)) : (NULL_TREE);
-  len = gfc_get_character_len (type);
+  len = slen ? slen : gfc_get_character_len (type);
   if (tmp && len && !integer_zerop (len))
     len = fold_build2_loc (input_location, MULT_EXPR,
 			   gfc_charlen_type_node, len, tmp);
@@ -84,6 +84,13 @@ gfc_get_character_len_in_bytes (tree type)
 }
 
 
+tree
+gfc_get_character_len_in_bytes (tree type)
+{
+  return gfc_get_character_len_in_bytes (type, NULL_TREE);
+}
+
+
 /* Convert a scalar to an array descriptor. To be used for assumed-rank
    arrays.  */
 
diff --git a/gcc/fortran/trans-types.cc b/gcc/fortran/trans-types.cc
index c9dddca3f718..aac36ea623a0 100644
--- a/gcc/fortran/trans-types.cc
+++ b/gcc/fortran/trans-types.cc
@@ -1704,7 +1704,7 @@ gfc_get_desc_dim_type (void)
    unknown cases abort.  */
 
 tree
-gfc_get_dtype_rank_type (int rank, tree etype)
+gfc_get_dtype_rank_type_slen (int rank, tree etype, tree length)
 {
   tree ptype;
   tree size;
@@ -1769,7 +1769,7 @@ gfc_get_dtype_rank_type (int rank, tree etype)
     {
     case BT_CHARACTER:
       gcc_assert (TREE_CODE (ptype) == ARRAY_TYPE);
-      size = gfc_get_character_len_in_bytes (ptype);
+      size = gfc_get_character_len_in_bytes (ptype, length);
       break;
     case BT_VOID:
       gcc_assert (TREE_CODE (ptype) == POINTER_TYPE);
@@ -1784,6 +1784,13 @@ gfc_get_dtype_rank_type (int rank, tree etype)
 }
 
 
+tree
+gfc_get_dtype_rank_type (int rank, tree etype)
+{
+  return gfc_get_dtype_rank_type_slen (rank, etype, NULL_TREE);
+}
+
+
 tree
 gfc_get_dtype (tree type, int * rank)
 {
diff --git a/gcc/fortran/trans-types.h b/gcc/fortran/trans-types.h
index a2169e436c8b..a8e03dc19cc1 100644
--- a/gcc/fortran/trans-types.h
+++ b/gcc/fortran/trans-types.h
@@ -119,6 +119,7 @@ bool gfc_return_by_reference (gfc_symbol *);
 bool gfc_is_nodesc_array (gfc_symbol *);
 
 /* Return the DTYPE for an array.  */
+tree gfc_get_dtype_rank_type_slen (int, tree, tree);
 tree gfc_get_dtype_rank_type (int, tree);
 tree gfc_get_dtype (tree, int *rank = NULL);
 
diff --git a/gcc/fortran/trans.h b/gcc/fortran/trans.h
index ca766e0a3394..6788c5dc4b5c 100644
--- a/gcc/fortran/trans.h
+++ b/gcc/fortran/trans.h
@@ -519,6 +519,7 @@ void gfc_conv_expr_type (gfc_se * se, gfc_expr *, tree);
 
 /* trans-expr.cc */
 tree gfc_get_character_len_in_bytes (tree);
+tree gfc_get_character_len_in_bytes (tree, tree);
 tree gfc_conv_scalar_to_descriptor (gfc_se *, tree, symbol_attribute);
 tree gfc_get_ultimate_alloc_ptr_comps_caf_token (gfc_se *, gfc_expr *);
 tree gfc_string_to_single_character (tree len, tree str, int kind);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.