https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61881

--- Comment #2 from Tobias Burnus <burnus at gcc dot gnu.org> ---
Draft patch:

--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -591,4 +591,10 @@ gfc_conv_intrinsic_to_class (gfc_se *parmse, gfc_expr *e,
       gfc_conv_expr_reference (parmse, e);
-      tmp = fold_convert (TREE_TYPE (ctree), parmse->expr);
-      gfc_add_modify (&parmse->pre, ctree, tmp);
+      if (class_ts.u.derived->components->as && e->rank == 0)
+        tmp = gfc_conv_scalar_to_descriptor (parmse, parmse->expr,
+                         gfc_expr_attr (e));
+      else
+        {
+          tmp = fold_convert (TREE_TYPE (ctree), parmse->expr);
+          gfc_add_modify (&parmse->pre, ctree, tmp);
+        }
     }
@@ -599,3 +605,10 @@ gfc_conv_intrinsic_to_class (gfc_se *parmse, gfc_expr *e,
       gfc_conv_expr_descriptor (parmse, e);
-      gfc_add_modify (&parmse->pre, ctree, parmse->expr);
+      if (class_ts.u.derived->components->as->rank != e->rank)
+        {
+          tmp = fold_build1_loc (input_location, VIEW_CONVERT_EXPR,
+                     TREE_TYPE (ctree), parmse->expr);
+          gfc_add_expr_to_block (&parmse->pre, tmp);
+        }
+      else
+        gfc_add_modify (&parmse->pre, ctree, parmse->expr);
     }

Reply via email to