aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/trans-io.c
diff options
context:
space:
mode:
authorJanne Blomqvist <jb@gcc.gnu.org>2005-11-19 23:36:06 +0200
committerJanne Blomqvist <jb@gcc.gnu.org>2005-11-19 23:36:06 +0200
commit815d8045e0779059e39afdcd9cf372412287a5b9 (patch)
tree911eae7deed2a6822d2396e660240b33d3023167 /gcc/fortran/trans-io.c
parent3817707ec3c877d6a120da73f4b2ae20b02fa4d8 (diff)
downloadgcc-815d8045e0779059e39afdcd9cf372412287a5b9.zip
gcc-815d8045e0779059e39afdcd9cf372412287a5b9.tar.gz
gcc-815d8045e0779059e39afdcd9cf372412287a5b9.tar.bz2
fortran ChangeLog:
2005-11-19 Janne Blomqvist <jb@gcc.gnu.org> PR fortran/24862 * trans-io.c (gfc_trans_transfer): Handle arrays of derived type. testsuite ChangeLog: 2005-11-19 Janne Blomqvist <jb@gcc.gnu.org> PR fortran/24862 * gfortran.dg/arrayio_derived_1.f90: New test. From-SVN: r107228
Diffstat (limited to 'gcc/fortran/trans-io.c')
-rw-r--r--gcc/fortran/trans-io.c41
1 files changed, 33 insertions, 8 deletions
diff --git a/gcc/fortran/trans-io.c b/gcc/fortran/trans-io.c
index 5eed8e8..bdfa450d 100644
--- a/gcc/fortran/trans-io.c
+++ b/gcc/fortran/trans-io.c
@@ -1640,11 +1640,41 @@ gfc_trans_transfer (gfc_code * code)
if (ss == gfc_ss_terminator)
{
+ /* Transfer a scalar value. */
gfc_conv_expr_reference (&se, expr);
transfer_expr (&se, &expr->ts, se.expr);
}
- else if (expr->ts.type == BT_DERIVED)
+ else
{
+ /* Transfer an array. There are 3 options:
+ 1) An array of an intrinsic type. This is handled by transfering
+ the descriptor to the library.
+ 2) A derived type containing an array. Scalarized by the frontend.
+ 3) An array of derived type. Scalarized by the frontend.
+ */
+ if (expr->ts.type != BT_DERIVED)
+ {
+ /* Get the descriptor. */
+ gfc_conv_expr_descriptor (&se, expr, ss);
+ /* If it's not an array of derived type, transfer the array
+ descriptor to the library. */
+ tmp = gfc_get_dtype (TREE_TYPE (se.expr));
+ if (((TREE_INT_CST_LOW (tmp) & GFC_DTYPE_TYPE_MASK)
+ >> GFC_DTYPE_TYPE_SHIFT) != GFC_DTYPE_DERIVED)
+ {
+ tmp = gfc_build_addr_expr (NULL, se.expr);
+ transfer_array_desc (&se, &expr->ts, tmp);
+ goto finish_block_label;
+ }
+ else
+ {
+ /* Cleanup the mess getting the descriptor caused. */
+ expr = code->expr;
+ ss = gfc_walk_expr (expr);
+ gfc_init_se (&se, NULL);
+ }
+ }
+
/* Initialize the scalarizer. */
gfc_init_loopinfo (&loop);
gfc_add_ss_to_loop (&loop, ss);
@@ -1663,13 +1693,8 @@ gfc_trans_transfer (gfc_code * code)
gfc_conv_expr_reference (&se, expr);
transfer_expr (&se, &expr->ts, se.expr);
}
- else
- {
- /* Pass the array descriptor to the library. */
- gfc_conv_expr_descriptor (&se, expr, ss);
- tmp = gfc_build_addr_expr (NULL, se.expr);
- transfer_array_desc (&se, &expr->ts, tmp);
- }
+
+ finish_block_label:
gfc_add_block_to_block (&body, &se.pre);
gfc_add_block_to_block (&body, &se.post);