From 5b51bd4300624fb2d6b17cbc2f4cfb3a946763c7 Mon Sep 17 00:00:00 2001 From: Paul Thomas Date: Tue, 3 Jul 2018 10:45:52 +0000 Subject: [PATCH] re PR fortran/82969 (ICE in gfc_class_vptr_get, at fortran/trans-expr.c:211) 2018-07-03 Paul Thomas PR fortran/82969 PR fortran/86242 * trans-array.c (structure_alloc_comps): Do not explicitly copy procedure pointer components. 2018-07-03 Paul Thomas PR fortran/82969 PR fortran/86242 * gfortran.dg/proc_ptr_50.f90: New test. From-SVN: r262339 --- gcc/fortran/ChangeLog | 7 +++ gcc/fortran/trans-array.c | 2 +- gcc/testsuite/ChangeLog | 10 +++- gcc/testsuite/gfortran.dg/proc_ptr_50.f90 | 68 +++++++++++++++++++++++ 4 files changed, 84 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/proc_ptr_50.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 695caeb0c97a..ce30a70c4c45 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2018-07-03 Paul Thomas + + PR fortran/82969 + PR fortran/86242 + * trans-array.c (structure_alloc_comps): Do not explicitly copy + procedure pointer components. + 2018-06-25 Jakub Jelinek Backported from mainline diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 0842a39db1aa..a719cb57f910 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -8240,7 +8240,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 1cb8d92ecf9c..cfc0e599c07d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-07-03 Paul Thomas + + PR fortran/82969 + PR fortran/86242 + * gfortran.dg/proc_ptr_50.f90: New test. + 2018-06-26 Kelvin Nilsen Backported from mainline @@ -279,7 +285,7 @@ * gcc.target/i386/pr80819-2.c: New test. 2017-11-24 Jakub Jelinek - + PR sanitizer/83014 * gcc.dg/ubsan/pr83014.c: New test. @@ -332,7 +338,7 @@ * gcc.dg/torture/pr85989.c: New test. 2018-06-21 Richard Biener - + Backport from mainline 2017-09-06 Richard Biener 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 +! +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 +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 + 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 -- 2.47.2