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

commit c3d8cf0e081de45c9a2f5d2d80ff8675f5e4614a
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Wed Jan 29 18:22:29 2025 +0100

    Factorisation set_descriptor_from_scalar conv_derived_to_class

Diff:
---
 gcc/fortran/trans-expr.cc | 42 +++++++++++++++++++++++-------------------
 1 file changed, 23 insertions(+), 19 deletions(-)

diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index 6afb344245f2..091e1417faed 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -174,7 +174,8 @@ gfc_conv_null_array_descriptor (gfc_se *se, gfc_symbol 
*sym, gfc_expr *expr)
 
 void
 set_descriptor_from_scalar (stmtblock_t *block, tree desc, tree scalar,
-                           gfc_expr *scalar_expr)
+                           gfc_expr *scalar_expr, bool is_class,
+                           tree cond_optional)
 {
   tree type = get_scalar_to_descriptor_type (scalar,
                                             gfc_expr_attr (scalar_expr));
@@ -185,9 +186,22 @@ set_descriptor_from_scalar (stmtblock_t *block, tree desc, 
tree scalar,
   tree dtype_ref = gfc_conv_descriptor_dtype (desc);
   gfc_add_modify (block, dtype_ref, dtype_val);
 
-  tree tmp = gfc_class_data_get (scalar);
-  if (!POINTER_TYPE_P (TREE_TYPE (tmp)))
-    tmp = gfc_build_addr_expr (NULL_TREE, tmp);
+  tree tmp;
+  if (is_class)
+    {
+      tmp = gfc_class_data_get (scalar);
+      if (!POINTER_TYPE_P (TREE_TYPE (tmp)))
+       tmp = gfc_build_addr_expr (NULL_TREE, tmp);
+    }
+  else if (cond_optional)
+    {
+      tmp = build3_loc (input_location, COND_EXPR, TREE_TYPE (scalar),
+                       cond_optional, scalar,
+                       fold_convert (TREE_TYPE (scalar),
+                                     null_pointer_node));
+    }
+  else
+    tmp = scalar;
 
   gfc_conv_descriptor_data_set (block, desc, tmp);
 }
@@ -1067,20 +1081,9 @@ 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 = get_scalar_to_descriptor_type (parmse->expr,
-                                                   gfc_expr_attr (e));
-             gfc_add_modify (&parmse->pre, gfc_conv_descriptor_dtype (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);
-           }
+           set_descriptor_from_scalar (&parmse->pre, ctree,
+                                       parmse->expr, e, false,
+                                       cond_optional);
           else
            {
              tmp = fold_convert (TREE_TYPE (ctree), parmse->expr);
@@ -1455,7 +1458,8 @@ gfc_conv_class_to_class (gfc_se *parmse, gfc_expr *e, 
gfc_typespec class_ts,
       && e->rank != class_ts.u.derived->components->as->rank)
     {
       if (e->rank == 0)
-       set_descriptor_from_scalar (&block, ctree, parmse->expr, e);
+       set_descriptor_from_scalar (&block, ctree, parmse->expr, e,
+                                   true, NULL_TREE);
       else
        gfc_class_array_data_assign (&block, ctree, parmse->expr, false);
     }

Reply via email to