This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]