This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Patch, Fortran, OOP] PR 46838: Initialization of polymorphic allocatable components
- From: Janus Weil <janus at gcc dot gnu dot org>
- To: gfortran <fortran at gcc dot gnu dot org>, gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Tue, 28 Dec 2010 15:39:31 +0100
- Subject: [Patch, Fortran, OOP] PR 46838: Initialization of polymorphic allocatable components
Hi all,
the attached patch fixes the subject line PR by making
'gfc_default_initializer' handle CLASS components properly. Regtested
on x86_64-unknown-linux-gnu. Ok for trunk?
Cheers,
Janus
2010-12-28 Janus Weil <janus@gcc.gnu.org>
PR fortran/46838
* expr.c (gfc_default_initializer): Handle allocatable CLASS components.
2010-12-28 Janus Weil <janus@gcc.gnu.org>
PR fortran/46838
* gfortran.dg/alloc_comp_class_2.f90: New.
Index: gcc/fortran/expr.c
===================================================================
--- gcc/fortran/expr.c (revision 168293)
+++ gcc/fortran/expr.c (working copy)
@@ -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;
! { 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