re PR fortran/45305 (Array-valued calles to elementals are not simplified)
authorPaul Thomas <pault@gcc.gnu.org>
Mon, 2 Jul 2018 07:24:43 +0000 (07:24 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Mon, 2 Jul 2018 07:24:43 +0000 (07:24 +0000)
2018-07-02  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/45305
* expr.c : Add a prototype for scalarize_intrinsic_call.
(gfc_simplify_expr): Use scalarize_intrinsic_call for elemental
intrinsic function calls.
(scalarize_intrinsic_call): Add 'init_flag' argument. Check if
the expression or any of the actual argument expressions are
NULL. Before calling gfc_check_init_expr, check 'init_flag'.
Only simplify the scalarized expressions if there are no errors
on the stack.
(gfc_check_init_expr): Set 'init_flag' true in the call to
scalarize_intrinsic_call.

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

PR fortran/45305
* gfortran.dg/scalarize_parameter_array_2.f90: New test.

From-SVN: r262300

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 4d2768c211c26f8bca7590897bf1d2480efa5b1a..b8e71975672146212af29cbd470e290e5b9fe6a9 100644 (file)
@@ -1,3 +1,10 @@
+2018-07-02  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-02  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/45305
index f0f5c1b709ee2841174a2aadf49dac453bb45ad5..81337944224186f9a6fe34477325ef46bfb3719b 100644 (file)
@@ -8842,7 +8842,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 196d7fe2f4beb1bc07958eefcffe1511d64d8caf..7a27de4f6a821006c6c031c5f91eac2dce7f9531 100644 (file)
@@ -1,3 +1,9 @@
+2018-07-02  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/82969
+       PR fortran/86242
+       * gfortran.dg/proc_ptr_50.f90: New test.
+
 2018-07-02  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/45305
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