aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHarald Anlauf <anlauf@gmx.de>2021-12-14 21:57:04 +0100
committerHarald Anlauf <anlauf@gmx.de>2021-12-14 21:57:04 +0100
commitca39102e10643a6b3f07d06934cc0907ba83d9ee (patch)
treee50b0a7706b76635fc12457406a66e65da46c6bd
parente866e1c92ecf88feeeafd5d55348451c9a181f3c (diff)
downloadgcc-ca39102e10643a6b3f07d06934cc0907ba83d9ee.zip
gcc-ca39102e10643a6b3f07d06934cc0907ba83d9ee.tar.gz
gcc-ca39102e10643a6b3f07d06934cc0907ba83d9ee.tar.bz2
Fortran: prevent NULL pointer dereference in check of passed do-loop variable
gcc/fortran/ChangeLog: PR fortran/103717 * frontend-passes.c (doloop_code): Prevent NULL pointer dereference when checking for passing a do-loop variable to a contained procedure with an interface mismatch. gcc/testsuite/ChangeLog: PR fortran/103717 * gfortran.dg/do_check_19.f90: New test.
-rw-r--r--gcc/fortran/frontend-passes.c2
-rw-r--r--gcc/testsuite/gfortran.dg/do_check_19.f9021
2 files changed, 22 insertions, 1 deletions
diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c
index c106ee0..6ffe072 100644
--- a/gcc/fortran/frontend-passes.c
+++ b/gcc/fortran/frontend-passes.c
@@ -2653,7 +2653,7 @@ doloop_code (gfc_code **c, int *walk_subtrees ATTRIBUTE_UNUSED,
do_sym = cl->ext.iterator->var->symtree->n.sym;
- if (a->expr && a->expr->symtree
+ if (a->expr && a->expr->symtree && f->sym
&& a->expr->symtree->n.sym == do_sym)
{
if (f->sym->attr.intent == INTENT_OUT)
diff --git a/gcc/testsuite/gfortran.dg/do_check_19.f90 b/gcc/testsuite/gfortran.dg/do_check_19.f90
new file mode 100644
index 0000000..1373a73
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/do_check_19.f90
@@ -0,0 +1,21 @@
+! { dg-do compile }
+! { dg-prune-output "Obsolescent feature: Alternate-return argument" }
+! PR fortran/103717 - ICE in doloop_code
+! Contributed by G.Steinmetz
+
+program p
+ integer :: i
+ do i = 1, 2
+ call s(i) ! { dg-error "Missing alternate return specifier" }
+ end do
+contains
+ subroutine s(*)
+ end
+end
+
+recursive subroutine s(*)
+ integer :: i
+ do i = 1, 2
+ call s(i) ! { dg-error "Missing alternate return specifier" }
+ end do
+end