re PR fortran/56385 ([OOP] ICE with allocatable function result in a procedure-pointe...
authorJanus Weil <janus@gcc.gnu.org>
Thu, 21 Feb 2013 12:26:44 +0000 (13:26 +0100)
committerJanus Weil <janus@gcc.gnu.org>
Thu, 21 Feb 2013 12:26:44 +0000 (13:26 +0100)
2013-02-21  Janus Weil  <janus@gcc.gnu.org>

PR fortran/56385
* trans-array.c (structure_alloc_comps): Handle procedure-pointer
components with allocatable result.

2013-02-21  Janus Weil  <janus@gcc.gnu.org>

PR fortran/56385
* gfortran.dg/proc_ptr_comp_37.f90: New.

From-SVN: r196202

gcc/fortran/ChangeLog
gcc/fortran/trans-array.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/proc_ptr_comp_37.f90 [new file with mode: 0644]

index a8ac81a53e733b36e9a71815f4af5dc65448f2f4..8aeded26d169f9f27e6d61f5d827d713b75550bb 100644 (file)
@@ -1,3 +1,9 @@
+2013-02-21  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/56385
+       * trans-array.c (structure_alloc_comps): Handle procedure-pointer
+       components with allocatable result.
+
 2012-02-21  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/56416
index ee2954e5bcab0a9dd48503d9580fa89158e1a676..75fed2f651cd13ed4470e793a9077654a8f9b967 100644 (file)
@@ -7547,8 +7547,8 @@ structure_alloc_comps (gfc_symbol * der_type, tree decl,
          called_dealloc_with_status = false;
          gfc_init_block (&tmpblock);
 
-         if (c->attr.allocatable
-             && (c->attr.dimension || c->attr.codimension))
+         if (c->attr.allocatable && (c->attr.dimension || c->attr.codimension)
+             && !c->attr.proc_pointer)
            {
              comp = fold_build3_loc (input_location, COMPONENT_REF, ctype,
                                      decl, cdecl, NULL_TREE);
@@ -7730,7 +7730,8 @@ structure_alloc_comps (gfc_symbol * der_type, tree decl,
              continue;
            }
 
-         if (c->attr.allocatable && !cmp_has_alloc_comps)
+         if (c->attr.allocatable && !c->attr.proc_pointer
+             && !cmp_has_alloc_comps)
            {
              rank = c->as ? c->as->rank : 0;
              tmp = gfc_duplicate_allocatable (dcmp, comp, ctype, rank);
index 5a2e02b73d266661601fd644af50d205af613df7..90df86498c016bb202ec2bea514a964416d2b1ba 100644 (file)
@@ -1,3 +1,8 @@
+2013-02-21  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/56385
+       * gfortran.dg/proc_ptr_comp_37.f90: New.
+
 2013-02-21  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/56415
diff --git a/gcc/testsuite/gfortran.dg/proc_ptr_comp_37.f90 b/gcc/testsuite/gfortran.dg/proc_ptr_comp_37.f90
new file mode 100644 (file)
index 0000000..9695b96
--- /dev/null
@@ -0,0 +1,25 @@
+! { dg-do compile }
+!
+! PR 56385: [4.6/4.7/4.8 Regression] [OOP] ICE with allocatable function result in a procedure-pointer component
+!
+! Contributed by Vladimir Fuka <vladimir.fuka@gmail.com>
+
+  implicit none
+  
+  type :: TGeometricShape
+  end type
+
+  type :: TVolumeSourceBody
+    class(TGeometricShape), allocatable :: GeometricShape
+    procedure(scalar_flux_interface), pointer :: get_scalar_flux
+  end type
+
+  abstract interface
+    function scalar_flux_interface(self) result(res)
+      import
+      real, allocatable :: res(:)
+      class(TVolumeSourceBody), intent(in) :: self
+    end function
+  end interface
+
+end