Dear all, the attached obvious patch fixes an ICE (assert) on invalid code that was introduced in 14-development during the work on ASSOCIATE issues.
Regtested on x86_64-pc-linux-gnu. OK for mainline / backports? Thanks, Harald
From 84a3a8e4e17babdaab29860e83f4c955f89ca9de Mon Sep 17 00:00:00 2001 From: Harald Anlauf <[email protected]> Date: Fri, 2 Oct 2026 23:37:46 +0200 Subject: [PATCH] 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. --- gcc/fortran/primary.cc | 2 ++ gcc/fortran/symbol.cc | 3 ++- gcc/testsuite/gfortran.dg/pr127683.f90 | 10 ++++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/pr127683.f90 diff --git a/gcc/fortran/primary.cc b/gcc/fortran/primary.cc index 5f6aac3328a..8eab4e7b9bd 100644 --- a/gcc/fortran/primary.cc +++ b/gcc/fortran/primary.cc @@ -2651,6 +2651,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 @@ -2658,6 +2659,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 f4536cb2fa9..73f0280645d 100644 --- a/gcc/fortran/symbol.cc +++ b/gcc/fortran/symbol.cc @@ -2525,7 +2525,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 00000000000..8e31c87df3e --- /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 -- 2.51.0
