aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/trans-stmt.c
diff options
context:
space:
mode:
authorMaxim Kuvyrkov <maxim.kuvyrkov@linaro.org>2017-11-16 11:51:10 +0000
committerMaxim Kuvyrkov <maxim.kuvyrkov@linaro.org>2017-11-16 11:53:17 +0000
commitef16ea796c1a1a19ae9175eeefad33b59033e9d0 (patch)
tree5655299f764b0d7b122812231c9b8780855881f5 /gcc/fortran/trans-stmt.c
parent44bfbd4b7991f48fc8bc46ce667ac7ca9b7c1f79 (diff)
Merge branches/gcc-6-branch rev 254791.
Change-Id: I6ea00b447fd24d0638f1fc025020ce898294a7ec
Diffstat (limited to 'gcc/fortran/trans-stmt.c')
-rw-r--r--gcc/fortran/trans-stmt.c29
1 files changed, 16 insertions, 13 deletions
diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c
index dcf17694920..45510bc51f7 100644
--- a/gcc/fortran/trans-stmt.c
+++ b/gcc/fortran/trans-stmt.c
@@ -5492,17 +5492,6 @@ gfc_trans_allocate (gfc_code * code)
}
gfc_add_modify_loc (input_location, &block, var, tmp);
- /* Deallocate any allocatable components after all the allocations
- and assignments of expr3 have been completed. */
- if (code->expr3->ts.type == BT_DERIVED
- && code->expr3->rank == 0
- && code->expr3->ts.u.derived->attr.alloc_comp)
- {
- tmp = gfc_deallocate_alloc_comp (code->expr3->ts.u.derived,
- var, 0);
- gfc_add_expr_to_block (&post, tmp);
- }
-
expr3 = var;
if (se.string_length)
/* Evaluate it assuming that it also is complicated like expr3. */
@@ -5513,6 +5502,19 @@ gfc_trans_allocate (gfc_code * code)
expr3 = se.expr;
expr3_len = se.string_length;
}
+
+ /* Deallocate any allocatable components after all the allocations
+ and assignments of expr3 have been completed. */
+ if ((code->expr3->ts.type == BT_DERIVED
+ || code->expr3->ts.type == BT_CLASS)
+ && (code->expr3->expr_type != EXPR_VARIABLE || temp_var_needed)
+ && code->expr3->ts.u.derived->attr.alloc_comp)
+ {
+ tmp = gfc_deallocate_alloc_comp (code->expr3->ts.u.derived,
+ expr3, code->expr3->rank);
+ gfc_prepend_expr_to_block (&post, tmp);
+ }
+
/* Store what the expr3 is to be used for. */
if (e3_is == E3_UNSET)
e3_is = expr3 != NULL_TREE ?
@@ -5691,10 +5693,9 @@ gfc_trans_allocate (gfc_code * code)
if (code->ext.alloc.ts.type != BT_CHARACTER)
expr3_esize = TYPE_SIZE_UNIT (
gfc_typenode_for_spec (&code->ext.alloc.ts));
- else
+ else if (code->ext.alloc.ts.u.cl->length != NULL)
{
gfc_expr *sz;
- gcc_assert (code->ext.alloc.ts.u.cl->length != NULL);
sz = gfc_copy_expr (code->ext.alloc.ts.u.cl->length);
gfc_init_se (&se_sz, NULL);
gfc_conv_expr (&se_sz, sz);
@@ -5708,6 +5709,8 @@ gfc_trans_allocate (gfc_code * code)
tmp, se_sz.expr);
expr3_esize = gfc_evaluate_now (expr3_esize, &block);
}
+ else
+ expr3_esize = NULL_TREE;
}
/* Loop over all objects to allocate. */