summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpault <pault@138bc75d-0d04-0410-961f-82ee72b054a4>2018-07-02 19:28:11 +0000
committerpault <pault@138bc75d-0d04-0410-961f-82ee72b054a4>2018-07-02 19:28:11 +0000
commit80ddc7311c33d9e9735c064d9087b24072e7fd89 (patch)
tree7eb129f35632c965fa61645c2e5ad19c19690edb
parentbaa4d8cdc5c5608ae9a47ff19b594453d79ce507 (diff)
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-8-branch@262316 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/trans-array.c2
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gfortran.dg/proc_ptr_50.f9068
4 files changed, 82 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 456f664cbcc6..6abbb42204b2 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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-06-28 Fritz Reese <fritzoreese@gmail.com>
PR fortran/82865
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index afa2d5c16b9e..f79f3ec583a4 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -8839,7 +8839,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. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 53236645a6f9..87b05d955ba8 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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-06-30 Alexandre Oliva <aoliva@redhat.com>
PR debug/86064
diff --git a/gcc/testsuite/gfortran.dg/proc_ptr_50.f90 b/gcc/testsuite/gfortran.dg/proc_ptr_50.f90
new file mode 100644
index 000000000000..14f0c0a79352
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/proc_ptr_50.f90
@@ -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