https://gcc.gnu.org/g:48616938660a9fe64824826ab9172a197631476d
commit r16-8319-g48616938660a9fe64824826ab9172a197631476d
Author: Paul Thomas <pault@gcc.gnu.org>
Date: Sat Mar 28 07:23:01 2026 +0000
Fortran: Avoid rollback ICE after invalid SELECT TYPE [PR84245]
2026-03-28 Paul Thomas <pault@gcc.gnu.org>
gcc/fortran
PR fortran/84245
* match.cc (gfc_match_select_type): Free the temporary namespace
only on MATCH_NO. Return immediately on MATCH_ERROR.
gcc/testsuite/ChangeLog:
* gfortran.dg/pr84245.f90: New test.
Diff:
---
gcc/fortran/match.cc | 7 ++++++-
gcc/testsuite/gfortran.dg/pr84245.f90 | 7 +++++++
2 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/gcc/fortran/match.cc b/gcc/fortran/match.cc
index b37337d505ff..62bdb8687e5a 100644
--- a/gcc/fortran/match.cc
+++ b/gcc/fortran/match.cc
@@ -7510,12 +7510,17 @@ gfc_match_select_type (void)
else
{
m = gfc_match (" %e ", &expr1);
- if (m != MATCH_YES)
+ if (m == MATCH_NO)
{
std::swap (ns, gfc_current_ns);
gfc_free_namespace (ns);
return m;
}
+ /* On MATCH_ERROR, the temporary block namespace may already contain
+ broken state from the failed expression match. Avoid freeing it
+ through the normal rollback path. */
+ else if (m == MATCH_ERROR)
+ return m;
}
m = gfc_match (" )%t");
diff --git a/gcc/testsuite/gfortran.dg/pr84245.f90 b/gcc/testsuite/gfortran.dg/pr84245.f90
new file mode 100644
index 000000000000..f43541fd4b24
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr84245.f90
@@ -0,0 +1,7 @@
+! { dg-do compile }
+! { dg-options "-w" }
+
+program p
+ select type (x%a) ! { dg-error "Unexpected '%'.*nonderived-type variable 'x'" }
+ end select ! { dg-error "Expecting END PROGRAM statement" }
+end