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); }