summaryrefslogtreecommitdiff
path: root/gcc/fortran/trans-array.c
diff options
context:
space:
mode:
authorrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>2013-12-04 12:54:49 +0000
committerrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>2013-12-04 12:54:49 +0000
commitbdff91a14bf8e5d18b1eb47bb529894482065762 (patch)
tree4515b21fe5d3e25b4d5c8f907d3e78834e1e40ac /gcc/fortran/trans-array.c
parent0158370253d4aef042c4d67b2c0278ded58d83fd (diff)
parent8192796762b4781de57ce2a6c104a71dcbd874e3 (diff)
downloadgcc-bdff91a14bf8e5d18b1eb47bb529894482065762.tar.gz
Merge with trunk.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/wide-int@205668 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fortran/trans-array.c')
-rw-r--r--gcc/fortran/trans-array.c35
1 files changed, 27 insertions, 8 deletions
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index 5b3cd1f6eb1..fc7ed1b2f0c 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -4336,10 +4336,18 @@ gfc_conv_resolve_dependencies (gfc_loopinfo * loop, gfc_ss * dest,
for (ss = rss; ss != gfc_ss_terminator; ss = ss->next)
{
+ ss_expr = ss->info->expr;
+
if (ss->info->type != GFC_SS_SECTION)
- continue;
+ {
+ if (gfc_option.flag_realloc_lhs
+ && dest_expr != ss_expr
+ && gfc_is_reallocatable_lhs (dest_expr)
+ && ss_expr->rank)
+ nDepend = gfc_check_dependency (dest_expr, ss_expr, true);
- ss_expr = ss->info->expr;
+ continue;
+ }
if (dest_expr->symtree->n.sym != ss_expr->symtree->n.sym)
{
@@ -8061,6 +8069,7 @@ gfc_alloc_allocatable_for_assignment (gfc_loopinfo *loop,
tree size1;
tree size2;
tree array1;
+ tree cond_null;
tree cond;
tree tmp;
tree tmp2;
@@ -8136,9 +8145,9 @@ gfc_alloc_allocatable_for_assignment (gfc_loopinfo *loop,
jump_label2 = gfc_build_label_decl (NULL_TREE);
/* Allocate if data is NULL. */
- cond = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node,
+ cond_null = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node,
array1, build_int_cst (TREE_TYPE (array1), 0));
- tmp = build3_v (COND_EXPR, cond,
+ tmp = build3_v (COND_EXPR, cond_null,
build1_v (GOTO_EXPR, jump_label1),
build_empty_stmt (input_location));
gfc_add_expr_to_block (&fblock, tmp);
@@ -8190,13 +8199,25 @@ gfc_alloc_allocatable_for_assignment (gfc_loopinfo *loop,
tmp = build1_v (LABEL_EXPR, jump_label1);
gfc_add_expr_to_block (&fblock, tmp);
- size1 = gfc_conv_descriptor_size (desc, expr1->rank);
+ /* If the lhs has not been allocated, its bounds will not have been
+ initialized and so its size is set to zero. */
+ size1 = gfc_create_var (gfc_array_index_type, NULL);
+ gfc_init_block (&alloc_block);
+ gfc_add_modify (&alloc_block, size1, gfc_index_zero_node);
+ gfc_init_block (&realloc_block);
+ gfc_add_modify (&realloc_block, size1,
+ gfc_conv_descriptor_size (desc, expr1->rank));
+ tmp = build3_v (COND_EXPR, cond_null,
+ gfc_finish_block (&alloc_block),
+ gfc_finish_block (&realloc_block));
+ gfc_add_expr_to_block (&fblock, tmp);
- /* Get the rhs size. Fix both sizes. */
+ /* Get the rhs size and fix it. */
if (expr2)
desc2 = rss->info->data.array.descriptor;
else
desc2 = NULL_TREE;
+
size2 = gfc_index_one_node;
for (n = 0; n < expr2->rank; n++)
{
@@ -8210,8 +8231,6 @@ gfc_alloc_allocatable_for_assignment (gfc_loopinfo *loop,
gfc_array_index_type,
tmp, size2);
}
-
- size1 = gfc_evaluate_now (size1, &fblock);
size2 = gfc_evaluate_now (size2, &fblock);
cond = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,