diff options
author | Harald Anlauf <anlauf@gmx.de> | 2021-12-14 21:57:04 +0100 |
---|---|---|
committer | Harald Anlauf <anlauf@gmx.de> | 2021-12-14 21:57:04 +0100 |
commit | ca39102e10643a6b3f07d06934cc0907ba83d9ee (patch) | |
tree | e50b0a7706b76635fc12457406a66e65da46c6bd | |
parent | e866e1c92ecf88feeeafd5d55348451c9a181f3c (diff) | |
download | gcc-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.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/do_check_19.f90 | 21 |
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 |