[gcc r11-6681] PR fortran/98661 - valgrind issues with error recovery
Harald Anlauf
anlauf@gcc.gnu.org
Thu Jan 14 18:21:28 GMT 2021
https://gcc.gnu.org/g:9e1e6e631045c7eed2c72738b7084986d39ca09f
commit r11-6681-g9e1e6e631045c7eed2c72738b7084986d39ca09f
Author: Harald Anlauf <anlauf@gmx.de>
Date: Thu Jan 14 19:21:05 2021 +0100
PR fortran/98661 - valgrind issues with error recovery
During error recovery after an invalid derived type specification it was
possible to try to resolve an invalid array specification. We now skip
this if the component has the ALLOCATABLE or POINTER attribute and the
shape is not deferred.
gcc/fortran/ChangeLog:
PR fortran/98661
* resolve.c (resolve_component): Derived type components with
ALLOCATABLE or POINTER attribute shall have a deferred shape.
gcc/testsuite/ChangeLog:
PR fortran/98661
* gfortran.dg/pr98661.f90: New test.
Diff:
---
gcc/fortran/resolve.c | 4 ++++
gcc/testsuite/gfortran.dg/pr98661.f90 | 19 +++++++++++++++++++
2 files changed, 23 insertions(+)
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index f243bd185b0..ab7ffc2c8b6 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -14723,6 +14723,10 @@ resolve_component (gfc_component *c, gfc_symbol *sym)
&& sym != c->ts.u.derived)
add_dt_to_dt_list (c->ts.u.derived);
+ if (c->as && c->as->type != AS_DEFERRED
+ && (c->attr.pointer || c->attr.allocatable))
+ return false;
+
if (!gfc_resolve_array_spec (c->as,
!(c->attr.pointer || c->attr.proc_pointer
|| c->attr.allocatable)))
diff --git a/gcc/testsuite/gfortran.dg/pr98661.f90 b/gcc/testsuite/gfortran.dg/pr98661.f90
new file mode 100644
index 00000000000..40ddff05d43
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr98661.f90
@@ -0,0 +1,19 @@
+! { dg-do compile }
+! PR fortran/98661 - valgrind issues with error recovery
+!
+! Test issues related to former testcase charlen_03.f90
+program p
+ implicit none
+ type t
+ character(:), pointer :: c(n) ! { dg-error "must have a deferred shape" }
+ real, allocatable :: x(n) ! { dg-error "must have a deferred shape" }
+ end type
+end
+
+subroutine s
+! no 'implicit none'
+ type u
+ character(:), pointer :: c(n) ! { dg-error "must have a deferred shape" }
+ real, allocatable :: x(n) ! { dg-error "must have a deferred shape" }
+ end type
+end
More information about the Gcc-cvs
mailing list