re PR fortran/46838 ([OOP] Initialization of polymorphic allocatable components)

2010-12-29  Janus Weil  <janus@gcc.gnu.org>

	PR fortran/46838
	* expr.c (gfc_default_initializer): Handle allocatable CLASS components.


2010-12-29  Janus Weil  <janus@gcc.gnu.org>

	PR fortran/46838
	* gfortran.dg/alloc_comp_class_2.f90: New.

From-SVN: r168322
This commit is contained in:
Janus Weil 2010-12-29 17:14:11 +01:00
parent bc81f55980
commit fbd30c381c
4 changed files with 43 additions and 2 deletions

View File

@ -1,3 +1,8 @@
2010-12-29 Janus Weil <janus@gcc.gnu.org>
PR fortran/46838
* expr.c (gfc_default_initializer): Handle allocatable CLASS components.
2010-12-29 Thomas Koenig <tkoenig@gcc.gnu.org>
* frontend-passes.c (gfc_code_walker): Handle expressions

View File

@ -3648,7 +3648,8 @@ gfc_default_initializer (gfc_typespec *ts)
/* See if we have a default initializer in this, but not in nested
types (otherwise we could use gfc_has_default_initializer()). */
for (comp = ts->u.derived->components; comp; comp = comp->next)
if (comp->initializer || comp->attr.allocatable)
if (comp->initializer || comp->attr.allocatable
|| (comp->ts.type == BT_CLASS && CLASS_DATA (comp)->attr.allocatable))
break;
if (!comp)
@ -3665,7 +3666,8 @@ gfc_default_initializer (gfc_typespec *ts)
if (comp->initializer)
ctor->expr = gfc_copy_expr (comp->initializer);
if (comp->attr.allocatable)
if (comp->attr.allocatable
|| (comp->ts.type == BT_CLASS && CLASS_DATA (comp)->attr.allocatable))
{
ctor->expr = gfc_get_expr ();
ctor->expr->expr_type = EXPR_NULL;

View File

@ -1,3 +1,8 @@
2010-12-29 Janus Weil <janus@gcc.gnu.org>
PR fortran/46838
* gfortran.dg/alloc_comp_class_2.f90: New.
2010-12-29 Thomas Koenig <tkoenig@gcc.gnu.org>
* gfortran.dg/character_comparison_7.f90: New test.

View File

@ -0,0 +1,29 @@
! { dg-do run }
!
! PR 46838: [OOP] Initialization of polymorphic allocatable components
!
! Contributed by Salvatore Filippone <sfilippone@uniroma2.it>
program bug28
implicit none
type indx_map
end type
type desc_type
integer, allocatable :: matrix_data
class(indx_map), allocatable :: indxmap
end type
type(desc_type) :: desc_a
call cdall(desc_a)
contains
subroutine cdall(desc)
type(desc_type), intent(out) :: desc
if (allocated(desc%indxmap)) call abort()
end subroutine cdall
end program