re PR fortran/46838 ([OOP] Initialization of polymorphic allocatable components)
authorJanus Weil <janus@gcc.gnu.org>
Wed, 29 Dec 2010 16:14:11 +0000 (17:14 +0100)
committerJanus Weil <janus@gcc.gnu.org>
Wed, 29 Dec 2010 16:14:11 +0000 (17:14 +0100)
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

gcc/fortran/ChangeLog
gcc/fortran/expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/alloc_comp_class_2.f90 [new file with mode: 0644]

index 8fc74f8..759db83 100644 (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
index a22e660..a222ff2 100644 (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;
index 4e245c9..49cf9fc 100644 (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.
diff --git a/gcc/testsuite/gfortran.dg/alloc_comp_class_2.f90 b/gcc/testsuite/gfortran.dg/alloc_comp_class_2.f90
new file mode 100644 (file)
index 0000000..7186281
--- /dev/null
@@ -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