https://gcc.gnu.org/g:065f26937728fa9ef6679a0540206016c9a946f0

commit r15-11650-g065f26937728fa9ef6679a0540206016c9a946f0
Author: Harald Anlauf <[email protected]>
Date:   Fri Oct 2 23:37:46 2026 +0200

    fortran: Fix error recovery on invalid inquiry refs [PR127683]
    
    Commit r14-9489 added an assert that could trigger while parsing an inquiry
    ref.  Replace assertion by the return of a failure value.  Fix latent
    frontend memleaks on error return path.
    
            PR fortran/127683
    
    gcc/fortran/ChangeLog:
    
            * primary.cc (gfc_match_varspec): Fix two minor frontend memleaks.
            * symbol.cc (gfc_find_derived_types): Return 0 when sym->assoc is
            NULL.
    
    gcc/testsuite/ChangeLog:
    
            * gfortran.dg/pr127683.f90: New test.
    
    (cherry picked from commit ab3c778a2530b25713002ba78af65334174deb3d)

Diff:
---
 gcc/fortran/primary.cc                 |  2 ++
 gcc/fortran/symbol.cc                  |  3 ++-
 gcc/testsuite/gfortran.dg/pr127683.f90 | 10 ++++++++++
 3 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/gcc/fortran/primary.cc b/gcc/fortran/primary.cc
index 45551cadab18..b6f9e15a1b3c 100644
--- a/gcc/fortran/primary.cc
+++ b/gcc/fortran/primary.cc
@@ -2594,6 +2594,7 @@ gfc_match_varspec (gfc_expr *primary, int equiv_flag, 
bool sub_flag,
                    {
                        gfc_error ("The RE or IM part_ref at %C must be "
                                   "applied to a COMPLEX expression");
+                       gfc_free_ref_list (tmp);
                        return MATCH_ERROR;
                    }
                  else if (tmp->u.i == INQUIRY_LEN
@@ -2601,6 +2602,7 @@ gfc_match_varspec (gfc_expr *primary, int equiv_flag, 
bool sub_flag,
                    {
                        gfc_error ("The LEN part_ref at %C must be applied "
                                   "to a CHARACTER expression");
+                       gfc_free_ref_list (tmp);
                        return MATCH_ERROR;
                    }
                }
diff --git a/gcc/fortran/symbol.cc b/gcc/fortran/symbol.cc
index 98dcec566b56..e7f9d3f5fecb 100644
--- a/gcc/fortran/symbol.cc
+++ b/gcc/fortran/symbol.cc
@@ -2452,7 +2452,8 @@ gfc_find_derived_types (gfc_symbol *sym, gfc_namespace 
*ns,
                        const char *name, bool stash)
 {
   gfc_namespace *encompassing = NULL;
-  gcc_assert (sym->assoc);
+  if (sym->assoc == NULL)
+    return 0;
 
   cts = 0;
   while (ns->parent)
diff --git a/gcc/testsuite/gfortran.dg/pr127683.f90 
b/gcc/testsuite/gfortran.dg/pr127683.f90
new file mode 100644
index 000000000000..8e31c87df3ec
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr127683.f90
@@ -0,0 +1,10 @@
+! { dg-do compile }
+!
+! PR fortran/127683 - we used to ICE on invalid inquiry refs
+
+program test
+  implicit none
+  print *, z%re   ! { dg-error "must be applied to a COMPLEX expression" }
+  print *, c%len  ! { dg-error "must be applied to a CHARACTER expression" }
+! print *, x%kind ! this also used to ICE, now gives a fatal error
+end program

Reply via email to