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

commit dfd45cf17371e73197cf75c63b71f7ed7fb4f9df
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Tue Aug 12 18:57:20 2025 +0200

    Refactoring gfc_set_descriptor_from_scalar

Diff:
---
 gcc/fortran/trans-descriptor.cc | 60 +++++++++++++++++------------------------
 gcc/fortran/trans-descriptor.h  |  3 ++-
 gcc/fortran/trans-expr.cc       |  2 +-
 3 files changed, 28 insertions(+), 37 deletions(-)

diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc
index f01f1a13fd6b..e6cc3a75eca3 100644
--- a/gcc/fortran/trans-descriptor.cc
+++ b/gcc/fortran/trans-descriptor.cc
@@ -1168,58 +1168,48 @@ gfc_create_null_actual_descriptor (stmtblock_t *block, 
gfc_typespec *ts,
 
 
 void
-gfc_set_descriptor_from_scalar_class (stmtblock_t *block, tree descr,
-                                     tree scalar, gfc_expr *scalar_expr)
-{
-  tree type = gfc_get_scalar_to_descriptor_type (TREE_TYPE (scalar),
-                                                gfc_expr_attr (scalar_expr));
-  gfc_conv_descriptor_dtype_set (block, descr,
-                                gfc_get_dtype (type));
-
-  tree tmp = gfc_class_data_get (scalar);
-  if (!POINTER_TYPE_P (TREE_TYPE (tmp)))
-    tmp = gfc_build_addr_expr (NULL_TREE, tmp);
-
-  gfc_conv_descriptor_data_set (block, descr, tmp);
-}
-
-
-void
-gfc_set_descriptor_from_scalar (stmtblock_t *block, tree descr,
-                               tree scalar, gfc_expr *scalar_expr,
-                               tree cond_presence, tree caf_token)
+gfc_set_descriptor_from_scalar (stmtblock_t *block, tree descr, tree scalar,
+                               symbol_attribute attr,
+                               tree cond_presence = NULL_TREE,
+                               tree caf_token = NULL_TREE)
 {
   if (flag_coarray == GFC_FCOARRAY_LIB && caf_token)
     gfc_conv_descriptor_token_set (block, descr, caf_token);
 
-  tree type = gfc_get_scalar_to_descriptor_type (TREE_TYPE (scalar),
-                                                gfc_expr_attr (scalar_expr));
-  gfc_conv_descriptor_dtype_set (block, descr,
-                                gfc_get_dtype (type));
+  tree type = gfc_get_scalar_to_descriptor_type (TREE_TYPE (scalar), attr);
+  if (!POINTER_TYPE_P (TREE_TYPE (scalar)))
+    scalar = gfc_build_addr_expr (NULL_TREE, scalar);
   if (cond_presence)
     scalar = build3_loc (input_location, COND_EXPR,
                         TREE_TYPE (scalar),
                         cond_presence, scalar,
                         fold_convert (TREE_TYPE (scalar),
                                       null_pointer_node));
+
+  gfc_conv_descriptor_dtype_set (block, descr, gfc_get_dtype (type));
   gfc_conv_descriptor_data_set (block, descr, scalar);
+  gfc_conv_descriptor_span_set (block, descr,
+                               gfc_conv_descriptor_elem_len_get (descr));
 }
 
 
 void
-gfc_set_descriptor_from_scalar (stmtblock_t *block, tree descr, tree scalar)
+gfc_set_descriptor_from_scalar_class (stmtblock_t *block, tree descr,
+                                     tree scalar, gfc_expr *scalar_expr)
 {
-  tree etype = TREE_TYPE (scalar);
-  if (!POINTER_TYPE_P (TREE_TYPE (scalar)))
-    scalar = gfc_build_addr_expr (NULL_TREE, scalar);
-  else if (TREE_TYPE (etype) && TREE_CODE (TREE_TYPE (etype)) == ARRAY_TYPE)
-    etype = TREE_TYPE (etype);
+  gfc_set_descriptor_from_scalar (block, descr, gfc_class_data_get (scalar),
+                                 gfc_expr_attr (scalar_expr));
+}
 
-  gfc_conv_descriptor_dtype_set (block, descr,
-                                gfc_get_dtype_rank_type (0, etype));
-  gfc_conv_descriptor_data_set (block, descr, scalar);
-  gfc_conv_descriptor_span_set (block, descr,
-                               gfc_conv_descriptor_elem_len_get (descr));
+
+void
+gfc_set_descriptor_from_scalar (stmtblock_t *block, tree descr,
+                               tree scalar, gfc_expr *scalar_expr,
+                               tree cond_presence, tree caf_token)
+{
+  gfc_set_descriptor_from_scalar (block, descr, scalar,
+                                 gfc_expr_attr (scalar_expr), cond_presence,
+                                 caf_token);
 }
 
 
diff --git a/gcc/fortran/trans-descriptor.h b/gcc/fortran/trans-descriptor.h
index 7668e5b45f22..46d8e210e41a 100644
--- a/gcc/fortran/trans-descriptor.h
+++ b/gcc/fortran/trans-descriptor.h
@@ -107,7 +107,8 @@ void gfc_copy_descriptor (stmtblock_t *, tree, tree, bool);
 void gfc_copy_descriptor (stmtblock_t *, tree, tree, int);
 
 void gfc_set_descriptor_from_scalar_class (stmtblock_t *, tree, tree, gfc_expr 
*);
-void gfc_set_descriptor_from_scalar (stmtblock_t *, tree, tree);
+void gfc_set_descriptor_from_scalar (stmtblock_t *, tree, tree, 
symbol_attribute,
+                                    tree = NULL_TREE, tree = NULL_TREE);
 void gfc_set_descriptor_from_scalar (stmtblock_t *, tree, tree, gfc_expr *,
                                     tree, tree);
 
diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index 1e594cfe5820..5329cc1fe134 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -108,7 +108,7 @@ gfc_conv_scalar_to_descriptor (gfc_se *se, tree scalar, 
symbol_attribute attr)
       scalar = tmp;
     }
 
-  gfc_set_descriptor_from_scalar (&se->pre, desc, scalar);
+  gfc_set_descriptor_from_scalar (&se->pre, desc, scalar, attr);
 
   /* Copy pointer address back - but only if it could have changed and
      if the actual argument is a pointer and not, e.g., NULL().  */

Reply via email to