]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/82969 (ICE in gfc_class_vptr_get, at fortran/trans-expr.c:211)
authorPaul Thomas <pault@gcc.gnu.org>
Tue, 3 Jul 2018 09:46:31 +0000 (09:46 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Tue, 3 Jul 2018 09:46:31 +0000 (09:46 +0000)
2018-07-03  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/82969
PR fortran/86242
* trans-array.c (structure_alloc_comps): Do not explicitly copy
procedure pointer components.

2018-07-03  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/82969
PR fortran/86242
* gfortran.dg/proc_ptr_50.f90: New test.

From-SVN: r262331

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

index 756a330178387792c55cd38c4f73c714f65da3f3..a9fa0f99fcb57bd3a7d3dd6a7364d322b45e39e8 100644 (file)
@@ -1,3 +1,10 @@
+2018-07-03  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/82969
+       PR fortran/86242
+       * trans-array.c (structure_alloc_comps): Do not explicitly copy
+       procedure pointer components.
+
 2018-06-25  Fritz Reese  <fritzoreese@gmail.com>
 
        PR fortran/82972
index cc9eb74f2fad160450c68d945f708308bf25e87c..8c566e857690625a14a53cecbe84e2090bab2e80 100644 (file)
@@ -8609,7 +8609,7 @@ structure_alloc_comps (gfc_symbol * der_type, tree decl,
          break;
 
        case COPY_ALLOC_COMP:
-         if (c->attr.pointer)
+         if (c->attr.pointer || c->attr.proc_pointer)
            continue;
 
          /* We need source and destination components.  */
index 1752201a47d64294fc2515ba506dbaed47fd5e2f..d81387571f46000a7dcddf1505ef976f41a94340 100644 (file)
@@ -1,3 +1,9 @@
+2018-07-03  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/82969
+       PR fortran/86242
+       * gfortran.dg/proc_ptr_50.f90: New test.
+
 2018-06-26  Kelvin Nilsen  <kelvin@gcc.gnu.org>
 
        Backported from mainline
diff --git a/gcc/testsuite/gfortran.dg/proc_ptr_50.f90 b/gcc/testsuite/gfortran.dg/proc_ptr_50.f90
new file mode 100644 (file)
index 0000000..14f0c0a
--- /dev/null
@@ -0,0 +1,68 @@
+! { dg-do compile }
+!
+! Test the fix for PR86242, in which the procedure pointer in 'tester'
+! was being copied as if it were an allocatable class component.
+!
+! Contributed by <cfd@mnet-mail.de>
+!
+module test
+
+   implicit none
+
+   private
+   public :: tester
+
+   type :: wrapper
+      integer(4) :: n
+   end type wrapper
+
+   type :: output
+      real(8) :: dummy
+   end type output
+
+   type :: tester
+      class(wrapper),  allocatable :: wrap
+      procedure(proc1), pointer :: ptr => null()
+   end type tester
+
+   abstract interface
+      function proc1(self) result(uc)
+         import :: tester, output
+         class(tester), intent(in) :: self
+         class(output), allocatable :: uc
+      end function proc1
+   end interface
+
+end module test
+
+! Comment #2 from Janus Weil  <janus@gcc.gnu.org>
+module test1
+
+   implicit none
+
+   type :: output
+   end type
+
+   type :: tester
+      integer,  allocatable :: wrap
+      procedure(proc1), pointer, nopass :: ptr
+   end type
+
+   interface                              ! Originally abstract
+      function proc1() result(uc)
+         import :: output
+         class(output), allocatable :: uc ! Works if a pointer
+      end function
+   end interface
+
+! PR82969 from Gerhard Steinmetz  <gscfq@t-online.de>
+   type t
+      real, allocatable :: x(:)
+      procedure(f), nopass, pointer :: g
+   end type
+contains
+   function f() result(z)
+      class(t), allocatable :: z
+   end
+
+end module test1