Commit 764d5c7b by Andre Vehreschild

re PR fortran/78958 (Unallocated memory access after SOURCE-ALLOCATEing…

re PR fortran/78958 (Unallocated memory access after SOURCE-ALLOCATEing unlimited polymorphic object)

gcc/fortran/ChangeLog:

2017-02-05  Andre Vehreschild  <vehre@gcc.gnu.org>

	PR fortran/78958
	* trans-stmt.c (gfc_trans_allocate): Add the multiplying the _len
	component of unlimited polymorphic objects when source-allocating.

From-SVN: r245192
parent 4b9c80d8
2017-02-05 Andre Vehreschild <vehre@gcc.gnu.org> 2017-02-05 Andre Vehreschild <vehre@gcc.gnu.org>
PR fortran/78958
* trans-stmt.c (gfc_trans_allocate): Add the multiplying the _len
component of unlimited polymorphic objects when source-allocating.
2017-02-05 Andre Vehreschild <vehre@gcc.gnu.org>
PR fortran/79230 PR fortran/79230
* trans-array.c (structure_alloc_comps): Ignore pointer components when * trans-array.c (structure_alloc_comps): Ignore pointer components when
freeing structures. freeing structures.
......
...@@ -6009,14 +6009,21 @@ gfc_trans_allocate (gfc_code * code) ...@@ -6009,14 +6009,21 @@ gfc_trans_allocate (gfc_code * code)
needs to be provided, which is done most of the time by the needs to be provided, which is done most of the time by the
pre-evaluation step. */ pre-evaluation step. */
nelems = NULL_TREE; nelems = NULL_TREE;
if (expr3_len && code->expr3->ts.type == BT_CHARACTER) if (expr3_len && (code->expr3->ts.type == BT_CHARACTER
/* When al is an array, then the element size for each element || code->expr3->ts.type == BT_CLASS))
in the array is needed, which is the product of the len and {
esize for char arrays. */ /* When al is an array, then the element size for each element
tmp = fold_build2_loc (input_location, MULT_EXPR, in the array is needed, which is the product of the len and
TREE_TYPE (expr3_esize), expr3_esize, esize for char arrays. For unlimited polymorphics len can be
fold_convert (TREE_TYPE (expr3_esize), zero, therefore take the maximum of len and one. */
expr3_len)); tmp = fold_build2_loc (input_location, MAX_EXPR,
TREE_TYPE (expr3_len),
expr3_len, fold_convert (TREE_TYPE (expr3_len),
integer_one_node));
tmp = fold_build2_loc (input_location, MULT_EXPR,
TREE_TYPE (expr3_esize), expr3_esize,
fold_convert (TREE_TYPE (expr3_esize), tmp));
}
else else
tmp = expr3_esize; tmp = expr3_esize;
if (!gfc_array_allocate (&se, expr, stat, errmsg, errlen, if (!gfc_array_allocate (&se, expr, stat, errmsg, errlen,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment