diff options
author | Tobias Burnus <burnus@net-b.de> | 2012-08-24 09:43:23 +0200 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2012-08-24 09:43:23 +0200 |
commit | 2960a3685367ff2a1da3dfa428c200e07d97fe6e (patch) | |
tree | bb525b29f9b4369506c97032008d05c66b3c238a /gcc/fortran/trans-io.c | |
parent | 3c5e0cc46e87e09af8363562699d716ae231a6b1 (diff) | |
download | gcc-2960a3685367ff2a1da3dfa428c200e07d97fe6e.zip gcc-2960a3685367ff2a1da3dfa428c200e07d97fe6e.tar.gz gcc-2960a3685367ff2a1da3dfa428c200e07d97fe6e.tar.bz2 |
re PR fortran/54350 (FAIL: gfortran.dg/realloc_on_assign_*.f90 -O (internal compiler error) at r190586)
2012-08-24 Tobias Burnus <burnus@net-b.de>
PR fortran/54350
* trans-array.c (free_ss_info): Free data.array.subscript.
(gfc_free_ss): No longer free data.array.subscript.
(walk_coarray): New function, moved from trans-intrinsic.c
(gfc_conv_expr_descriptor): Walk array descriptor instead
of taking passed "ss".
(get_array_ctor_all_strlen, gfc_add_loop_ss_code,
gfc_conv_array_parameter): Update call and cleanup ss handling.
* trans-array.h (gfc_conv_expr_descriptor,
gfc_conv_array_parameter): Update prototype.
* trans-expr.c (gfc_conv_derived_to_class,
conv_isocbinding_procedure, gfc_conv_procedure_call,
gfc_trans_alloc_subarray_assign, gfc_trans_subcomponent_assign,
gfc_trans_pointer_assignment, gfc_trans_arrayfunc_assign): Update
call to gfc_conv_expr_descriptor and gfc_conv_array_parameter,
and clean up.
* trans-intrinsic.c (walk_coarray): Moved to trans-array.c
(trans_this_image, trans_image_index, gfc_conv_intrinsic_rank
gfc_conv_intrinsic_bound, gfc_conv_intrinsic_cobound,
gfc_conv_intrinsic_len, gfc_conv_intrinsic_size,
gfc_conv_intrinsic_sizeof, gfc_conv_intrinsic_storage_size,
gfc_conv_intrinsic_transfer, gfc_conv_allocated,
gfc_conv_associated, gfc_conv_intrinsic_loc,
conv_intrinsic_move_alloc): Update calls.
* trans-io.c (gfc_convert_array_to_string, set_internal_unit,
gfc_trans_transfer): Ditto.
* trans-stmt.c (gfc_conv_elemental_dependencies,
gfc_trans_sync, trans_associate_var,
gfc_trans_pointer_assign_need_temp): Ditto.
From-SVN: r190641
Diffstat (limited to 'gcc/fortran/trans-io.c')
-rw-r--r-- | gcc/fortran/trans-io.c | 15 |
1 files changed, 6 insertions, 9 deletions
diff --git a/gcc/fortran/trans-io.c b/gcc/fortran/trans-io.c index 9d7d5b6..34db6fd 100644 --- a/gcc/fortran/trans-io.c +++ b/gcc/fortran/trans-io.c @@ -664,7 +664,7 @@ gfc_convert_array_to_string (gfc_se * se, gfc_expr * e) return; } - gfc_conv_array_parameter (se, e, gfc_walk_expr (e), true, NULL, NULL, &size); + gfc_conv_array_parameter (se, e, true, NULL, NULL, &size); se->string_length = fold_convert (gfc_charlen_type_node, size); } @@ -780,8 +780,6 @@ set_internal_unit (stmtblock_t * block, stmtblock_t * post_block, /* Character array. */ else if (e->rank > 0) { - se.ss = gfc_walk_expr (e); - if (is_subref_array (e)) { /* Use a temporary for components of arrays of derived types @@ -796,7 +794,7 @@ set_internal_unit (stmtblock_t * block, stmtblock_t * post_block, else { /* Return the data pointer and rank from the descriptor. */ - gfc_conv_expr_descriptor (&se, e, se.ss); + gfc_conv_expr_descriptor (&se, e); tmp = gfc_conv_descriptor_data_get (se.expr); se.expr = gfc_build_addr_expr (pchar_type_node, se.expr); } @@ -2236,12 +2234,10 @@ gfc_trans_transfer (gfc_code * code) gfc_init_block (&body); expr = code->expr1; - ss = gfc_walk_expr (expr); - ref = NULL; gfc_init_se (&se, NULL); - if (ss == gfc_ss_terminator) + if (expr->rank == 0) { /* Transfer a scalar value. */ gfc_conv_expr_reference (&se, expr); @@ -2281,15 +2277,16 @@ gfc_trans_transfer (gfc_code * code) else { /* Get the descriptor. */ - gfc_conv_expr_descriptor (&se, expr, ss); + gfc_conv_expr_descriptor (&se, expr); tmp = gfc_build_addr_expr (NULL_TREE, se.expr); } transfer_array_desc (&se, &expr->ts, tmp); goto finish_block_label; } - + /* Initialize the scalarizer. */ + ss = gfc_walk_expr (expr); gfc_init_loopinfo (&loop); gfc_add_ss_to_loop (&loop, ss); |