aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndre Vehreschild <vehre@gcc.gnu.org>2025-03-21 09:13:29 +0100
committerAndre Vehreschild <vehre@gcc.gnu.org>2025-03-21 13:31:55 +0100
commita5c69abf1384ec6163cd5e14146e8b3876e8b95c (patch)
tree4725f107c7547888a671fe0ad1e9a0c1728fe3b1 /gcc
parentadbbf12a8f86ecb5c288302069f929d85c6b45ad (diff)
downloadgcc-a5c69abf1384ec6163cd5e14146e8b3876e8b95c.zip
gcc-a5c69abf1384ec6163cd5e14146e8b3876e8b95c.tar.gz
gcc-a5c69abf1384ec6163cd5e14146e8b3876e8b95c.tar.bz2
Fortran: Fix freeing procedure pointer components [PR119380]
PR fortran/119380 gcc/fortran/ChangeLog: * trans-array.cc (structure_alloc_comps): Prevent freeing of procedure pointer components. gcc/testsuite/ChangeLog: * gfortran.dg/proc_ptr_comp_54.f90: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/trans-array.cc2
-rw-r--r--gcc/testsuite/gfortran.dg/proc_ptr_comp_54.f9030
2 files changed, 31 insertions, 1 deletions
diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index e9eacf2..9606131 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -10109,7 +10109,7 @@ structure_alloc_comps (gfc_symbol * der_type, tree decl, tree dest,
else
{
attr = &c->attr;
- if (attr->pointer)
+ if (attr->pointer || attr->proc_pointer)
continue;
}
diff --git a/gcc/testsuite/gfortran.dg/proc_ptr_comp_54.f90 b/gcc/testsuite/gfortran.dg/proc_ptr_comp_54.f90
new file mode 100644
index 0000000..f5b7fa8
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/proc_ptr_comp_54.f90
@@ -0,0 +1,30 @@
+!{ dg-do run }
+
+! Do not free procedure pointer components.
+! Contributed by Damian Rouson <damian@archaeologic.codes>
+
+ implicit none
+
+ type foo_t
+ integer, allocatable :: i_
+ procedure(f), pointer, nopass :: f_
+ procedure(c), pointer, nopass :: c_
+ end type
+
+ class(foo_t), allocatable :: ff
+
+ associate(foo => foo_t(1,f))
+ end associate
+
+contains
+
+ function f()
+ logical, allocatable :: f
+ f = .true.
+ end function
+
+ function c()
+ class(foo_t), allocatable :: c
+ allocate(c)
+ end function
+end