https://gcc.gnu.org/g:48f1a7ff5b59a3074a24e23e039df40ebf6ffa81

commit 48f1a7ff5b59a3074a24e23e039df40ebf6ffa81
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Tue Jul 22 21:03:11 2025 +0200

    Extraction gfc_set_descriptor_from_scalar

Diff:
---
 gcc/fortran/trans-descriptor.cc | 20 ++++++++++++++++++++
 gcc/fortran/trans-descriptor.h  |  2 ++
 gcc/fortran/trans-expr.cc       | 16 ++--------------
 3 files changed, 24 insertions(+), 14 deletions(-)

diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc
index 6995eb1da052..cef609e0464b 100644
--- a/gcc/fortran/trans-descriptor.cc
+++ b/gcc/fortran/trans-descriptor.cc
@@ -1882,3 +1882,23 @@ gfc_set_descriptor_from_scalar (stmtblock_t *block, tree 
descr,
   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 type;
+  type = gfc_get_scalar_to_descriptor_type (scalar,
+                                           gfc_expr_attr (scalar_expr));
+  gfc_conv_descriptor_dtype_set (block, descr,
+                                gfc_get_dtype (type));
+  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_data_set (block, descr, scalar);
+}
+
diff --git a/gcc/fortran/trans-descriptor.h b/gcc/fortran/trans-descriptor.h
index 0e87eee39b38..32b045ac8c1b 100644
--- a/gcc/fortran/trans-descriptor.h
+++ b/gcc/fortran/trans-descriptor.h
@@ -128,5 +128,7 @@ void gfc_set_gfc_from_cfi (stmtblock_t *, tree, gfc_expr *, 
tree, tree,
 void gfc_set_gfc_from_cfi (stmtblock_t *, stmtblock_t *, tree, tree, tree,
                           gfc_symbol *, bool);
 void gfc_set_descriptor_from_scalar (stmtblock_t *, tree, tree, gfc_expr *);
+void gfc_set_descriptor_from_scalar (stmtblock_t *, tree, tree, gfc_expr *,
+                                    tree);
 
 #endif /* GFC_TRANS_DESCRIPTOR_H */
diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index 5c906403e524..f5730c1cf0ba 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -938,20 +938,8 @@ gfc_conv_derived_to_class (gfc_se *parmse, gfc_expr *e, 
gfc_symbol *fsym,
 
          /* Scalar to an assumed-rank array.  */
          if (fsym->ts.u.derived->components->as)
-           {
-             tree type;
-             type = gfc_get_scalar_to_descriptor_type (parmse->expr,
-                                                       gfc_expr_attr (e));
-             gfc_conv_descriptor_dtype_set (&parmse->pre, ctree,
-                                            gfc_get_dtype (type));
-             if (optional)
-               parmse->expr = build3_loc (input_location, COND_EXPR,
-                                          TREE_TYPE (parmse->expr),
-                                          cond_optional, parmse->expr,
-                                          fold_convert (TREE_TYPE 
(parmse->expr),
-                                                        null_pointer_node));
-             gfc_conv_descriptor_data_set (&parmse->pre, ctree, parmse->expr);
-           }
+           gfc_set_descriptor_from_scalar (&parmse->pre, ctree,
+                                           parmse->expr, e, cond_optional);
           else
            {
              tmp = fold_convert (TREE_TYPE (ctree), parmse->expr);

Reply via email to