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
This commit is contained in:
Andre Vehreschild 2017-02-05 13:42:31 +01:00
parent 4b9c80d8e4
commit 764d5c7b53
2 changed files with 21 additions and 8 deletions

View File

@ -1,3 +1,9 @@
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

View File

@ -6009,14 +6009,21 @@ gfc_trans_allocate (gfc_code * code)
needs to be provided, which is done most of the time by the
pre-evaluation step. */
nelems = NULL_TREE;
if (expr3_len && code->expr3->ts.type == BT_CHARACTER)
/* When al is an array, then the element size for each element
in the array is needed, which is the product of the len and
esize for char arrays. */
tmp = fold_build2_loc (input_location, MULT_EXPR,
TREE_TYPE (expr3_esize), expr3_esize,
fold_convert (TREE_TYPE (expr3_esize),
expr3_len));
if (expr3_len && (code->expr3->ts.type == BT_CHARACTER
|| code->expr3->ts.type == BT_CLASS))
{
/* When al is an array, then the element size for each element
in the array is needed, which is the product of the len and
esize for char arrays. For unlimited polymorphics len can be
zero, therefore take the maximum of len and one. */
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
tmp = expr3_esize;
if (!gfc_array_allocate (&se, expr, stat, errmsg, errlen,