Dear all, when accessing CLASS components we need to ensure that the corresponding class container has already been built. Invalid code, e.g. the testcase in PR103606, may otherwise generate segfaults due to invalid reads.
Regtested on x86_64-pc-linux-gnu. OK for mainline / branches? Thanks, Harald
From 6e41e4391a54337bd32560be2b72e11ceba37b3a Mon Sep 17 00:00:00 2001 From: Harald Anlauf <anl...@gmx.de> Date: Fri, 10 Dec 2021 22:41:24 +0100 Subject: [PATCH] Fortran: fix checking of elemental functions of type CLASS gcc/fortran/ChangeLog: PR fortran/103606 * resolve.c (resolve_fl_procedure): Do not access CLASS components before class container has been built. gcc/testsuite/ChangeLog: PR fortran/103606 * gfortran.dg/pr103606.f90: New test. --- gcc/fortran/resolve.c | 3 ++- gcc/testsuite/gfortran.dg/pr103606.f90 | 12 ++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/pr103606.f90 diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 0ed31970f8b..bff1b35446f 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -13294,7 +13294,8 @@ resolve_fl_procedure (gfc_symbol *sym, int mp_flag) /* An elemental function is required to return a scalar 12.7.1 */ if (sym->attr.elemental && sym->attr.function - && (sym->as || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)->as))) + && (sym->as || (sym->ts.type == BT_CLASS && sym->attr.class_ok + && CLASS_DATA (sym)->as))) { gfc_error ("ELEMENTAL function %qs at %L must have a scalar " "result", sym->name, &sym->declared_at); diff --git a/gcc/testsuite/gfortran.dg/pr103606.f90 b/gcc/testsuite/gfortran.dg/pr103606.f90 new file mode 100644 index 00000000000..43283184e89 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr103606.f90 @@ -0,0 +1,12 @@ +! { dg-do compile } +! PR fortran/103606 - ICE in resolve_fl_procedure +! Contributed by G.Steinmetz + +program p + type t + end type +contains + elemental function f() result(z) ! { dg-error "CLASS variable" } + class(t) :: z + end +end -- 2.26.2