PR fortran/103606 - [9/10/11/12 Regression] ICE in resolve_fl_procedure, at fortran/resolve.c:13297
Commit Message
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
Comments
On 10/12/2021 22:49, Harald Anlauf via Fortran wrote:
> 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?
>
OK (obvious even)
From 6e41e4391a54337bd32560be2b72e11ceba37b3a Mon Sep 17 00:00:00 2001
From: Harald Anlauf <anlauf@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
@@ -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);
new file mode 100644
@@ -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