re PR fortran/71623 (Segfault when allocating deferred-length characters to size of a pointer)

gcc/fortran/ChangeLog:

2016-07-05  Andre Vehreschild  <vehre@gcc.gnu.org>

	PR fortran/71623
	* trans-stmt.c (gfc_trans_allocate): Add code of pre block of typespec
	in allocate to parent block.

gcc/testsuite/ChangeLog:

2016-07-05  Andre Vehreschild  <vehre@gcc.gnu.org>

	PR fortran/71623
	* gfortran.dg/deferred_character_17.f90: New test.

From-SVN: r238002
This commit is contained in:
Andre Vehreschild 2016-07-05 14:06:22 +02:00
parent b0ad2d78b2
commit 69aaea0663
4 changed files with 40 additions and 5 deletions

View File

@ -1,3 +1,9 @@
2016-07-05 Andre Vehreschild <vehre@gcc.gnu.org>
PR fortran/71623
* trans-stmt.c (gfc_trans_allocate): Add code of pre block of typespec
in allocate to parent block.
2016-07-04 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/66575

View File

@ -5696,9 +5696,11 @@ gfc_trans_allocate (gfc_code * code)
tmp = gfc_get_char_type (code->ext.alloc.ts.kind);
tmp = TYPE_SIZE_UNIT (tmp);
tmp = fold_convert (TREE_TYPE (se_sz.expr), tmp);
gfc_add_block_to_block (&block, &se_sz.pre);
expr3_esize = fold_build2_loc (input_location, MULT_EXPR,
TREE_TYPE (se_sz.expr),
tmp, se_sz.expr);
expr3_esize = gfc_evaluate_now (expr3_esize, &block);
}
}
@ -5897,6 +5899,7 @@ gfc_trans_allocate (gfc_code * code)
source= or mold= expression. */
gfc_init_se (&se_sz, NULL);
gfc_conv_expr (&se_sz, code->ext.alloc.ts.u.cl->length);
gfc_add_block_to_block (&block, &se_sz.pre);
gfc_add_modify (&block, al_len,
fold_convert (TREE_TYPE (al_len),
se_sz.expr));
@ -5981,11 +5984,19 @@ gfc_trans_allocate (gfc_code * code)
specified by a type spec for deferred length character
arrays or unlimited polymorphic objects without a
source= or mold= expression. */
gfc_init_se (&se_sz, NULL);
gfc_conv_expr (&se_sz, code->ext.alloc.ts.u.cl->length);
gfc_add_modify (&block, al_len,
fold_convert (TREE_TYPE (al_len),
se_sz.expr));
if (expr3_esize == NULL_TREE || code->ext.alloc.ts.kind != 1)
{
gfc_init_se (&se_sz, NULL);
gfc_conv_expr (&se_sz, code->ext.alloc.ts.u.cl->length);
gfc_add_block_to_block (&block, &se_sz.pre);
gfc_add_modify (&block, al_len,
fold_convert (TREE_TYPE (al_len),
se_sz.expr));
}
else
gfc_add_modify (&block, al_len,
fold_convert (TREE_TYPE (al_len),
expr3_esize));
}
else
/* No length information needed, because type to allocate

View File

@ -1,3 +1,8 @@
2016-07-05 Andre Vehreschild <vehre@gcc.gnu.org>
PR fortran/71623
* gfortran.dg/deferred_character_17.f90: New test.
2016-07-05 Christophe Lyon <christophe.lyon@linaro.org>
* gcc.target/arm/neon/polytypes.c: Move to ...

View File

@ -0,0 +1,13 @@
!{ dg-do run }
! Check fix for PR fortran/71623
program allocatemvce
implicit none
character(len=:), allocatable :: string
integer, dimension(4), target :: array = [1,2,3,4]
integer, dimension(:), pointer :: array_ptr
array_ptr => array
! The allocate used to segfault
allocate(character(len=size(array_ptr))::string)
end program allocatemvce