[gcc r16-8319] Fortran: Avoid rollback ICE after invalid SELECT TYPE [PR84245]

Paul Thomas pault@gcc.gnu.org
Sat Mar 28 07:23:12 GMT 2026


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


More information about the Gcc-cvs mailing list