Commit e3a7c6cf by Andre Vehreschild Committed by Andre Vehreschild

re PR fortran/60289 (allocating class(*) pointer as character gives type-spec…

re PR fortran/60289 (allocating class(*) pointer as character gives type-spec requires the same character-length parameter)

	PR fortran/60289
	Initial patch by Janus Weil
	* resolve.c (resolve_allocate_expr): Add check for comp. only when 
	target is not unlimited polymorphic.
	* trans-stmt.c (gfc_trans_allocate): Assign correct value to _len
	component of unlimited polymorphic entities.

	* gfortran.dg/unlimited_polymorphic_22.f90: New test.

From-SVN: r220474
parent 9fb87eb0
2015-01-29 Andre Vehreschild <vehre@gmx.de>, Janus Weil <janus@gcc.gnu.org>
PR fortran/60289
Initial patch by Janus Weil
* resolve.c (resolve_allocate_expr): Add check for comp. only when
target is not unlimited polymorphic.
* trans-stmt.c (gfc_trans_allocate): Assign correct value to _len
component of unlimited polymorphic entities.
2015-01-29 Andre Vehreschild <vehre@gmx.de>
* gfortran.dg/unlimited_polymorphic_22.f90: New test.
2015-02-05 Tobias Burnus <burnus@net-b.de>
PR fortran/64943
......
......@@ -6933,7 +6933,9 @@ resolve_allocate_expr (gfc_expr *e, gfc_code *code)
goto failure;
}
if (code->ext.alloc.ts.type == BT_CHARACTER && !e->ts.deferred)
/* Check F08:C632. */
if (code->ext.alloc.ts.type == BT_CHARACTER && !e->ts.deferred
&& !UNLIMITED_POLY (e))
{
int cmp = gfc_dep_compare_expr (e->ts.u.cl->length,
code->ext.alloc.ts.u.cl->length);
......
......@@ -5167,6 +5167,15 @@ gfc_trans_allocate (gfc_code * code)
se_sz.expr = gfc_evaluate_now (se_sz.expr, &se.pre);
gfc_add_block_to_block (&se.pre, &se_sz.post);
/* Store the string length. */
if ((expr->symtree->n.sym->ts.type == BT_CLASS
|| expr->symtree->n.sym->ts.type == BT_DERIVED)
&& expr->ts.u.derived->attr.unlimited_polymorphic)
/* For unlimited polymorphic entities get the backend_decl of
the _len component for that. */
tmp = gfc_class_len_get (gfc_get_symbol_decl (
expr->symtree->n.sym));
else
/* Else use what is stored in the charlen->backend_decl. */
tmp = al->expr->ts.u.cl->backend_decl;
gfc_add_modify (&se.pre, tmp, fold_convert (TREE_TYPE (tmp),
se_sz.expr));
......
! { dg-do run }
! Testing fix for PR fortran/60289
! Contributed by: Andre Vehreschild <vehre@gmx.de>
!
program test
implicit none
class(*), pointer :: P
integer :: string_len = 10 *2
allocate(character(string_len)::P)
select type(P)
type is (character(*))
P ="some test string"
if (P .ne. "some test string") then
call abort ()
end if
if (len(P) .ne. 20) then
call abort ()
end if
if (len(P) .eq. len("some test string")) then
call abort ()
end if
class default
call abort ()
end select
deallocate(P)
! Now for kind=4 chars.
allocate(character(len=20,kind=4)::P)
select type(P)
type is (character(len=*,kind=4))
P ="some test string"
if (P .ne. 4_"some test string") then
call abort ()
end if
if (len(P) .ne. 20) then
call abort ()
end if
if (len(P) .eq. len("some test string")) then
call abort ()
end if
type is (character(len=*,kind=1))
call abort ()
class default
call abort ()
end select
deallocate(P)
end program test
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