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:
parent
b0ad2d78b2
commit
69aaea0663
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 ...
|
||||
|
13
gcc/testsuite/gfortran.dg/deferred_character_17.f90
Normal file
13
gcc/testsuite/gfortran.dg/deferred_character_17.f90
Normal 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
|
Loading…
Reference in New Issue
Block a user