aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/trans-stmt.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/fortran/trans-stmt.cc')
-rw-r--r--gcc/fortran/trans-stmt.cc16
1 files changed, 16 insertions, 0 deletions
diff --git a/gcc/fortran/trans-stmt.cc b/gcc/fortran/trans-stmt.cc
index f25335d..0e82d2a 100644
--- a/gcc/fortran/trans-stmt.cc
+++ b/gcc/fortran/trans-stmt.cc
@@ -2092,6 +2092,22 @@ trans_associate_var (gfc_symbol *sym, gfc_wrapped_block *block)
gfc_free_expr (expr1);
gfc_free_expr (expr2);
}
+ /* PDT array and string components are separately allocated for each element
+ of a PDT array. Therefore, there is no choice but to copy in and copy out
+ the target expression. */
+ else if (e && is_subref_array (e)
+ && (gfc_expr_attr (e).pdt_array || gfc_expr_attr (e).pdt_string))
+ {
+ gfc_se init;
+ gcc_assert (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (sym->backend_decl)));
+ gfc_init_se (&init, NULL);
+ gfc_conv_subref_array_arg (&init, e, false, INTENT_INOUT,
+ sym && sym->attr.pointer);
+ init.expr = build_fold_indirect_ref_loc (input_location, init.expr);
+ gfc_add_modify (&init.pre, sym->backend_decl, init.expr);
+ gfc_add_init_cleanup (block, gfc_finish_block (&init.pre),
+ gfc_finish_block (&init.post));
+ }
else if ((sym->attr.dimension || sym->attr.codimension) && !class_target
&& (sym->as->type == AS_DEFERRED || sym->assoc->variable))
{