From: Harald Anlauf Date: Fri, 22 Sep 2023 19:06:00 +0000 (+0200) Subject: fortran: error recovery on duplicate declaration of class variable [PR95710] X-Git-Tag: basepoints/gcc-15~5901 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=767eea9ea22f0247be9a56fd2e1d460ddfbbf6d9;p=thirdparty%2Fgcc.git fortran: error recovery on duplicate declaration of class variable [PR95710] gcc/fortran/ChangeLog: PR fortran/95710 * class.cc (gfc_build_class_symbol): Do not try to build class container for invalid typespec. * resolve.cc (resolve_fl_var_and_proc): Prevent NULL pointer dereference. (resolve_symbol): Likewise. gcc/testsuite/ChangeLog: PR fortran/95710 * gfortran.dg/pr95710.f90: New test. --- diff --git a/gcc/fortran/class.cc b/gcc/fortran/class.cc index 9d0c802b8676..5c43b77dba38 100644 --- a/gcc/fortran/class.cc +++ b/gcc/fortran/class.cc @@ -647,6 +647,10 @@ gfc_build_class_symbol (gfc_typespec *ts, symbol_attribute *attr, gcc_assert (as); + /* We cannot build the class container now. */ + if (attr->class_ok && (!ts->u.derived || !ts->u.derived->components)) + return false; + /* Class container has already been built with same name. */ if (attr->class_ok && ts->u.derived->components->attr.dimension >= attr->dimension diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc index 1042b8c18e8e..861f69ac20fd 100644 --- a/gcc/fortran/resolve.cc +++ b/gcc/fortran/resolve.cc @@ -13326,6 +13326,7 @@ resolve_fl_var_and_proc (gfc_symbol *sym, int mp_flag) && sym->ts.u.derived && !sym->attr.select_type_temporary && !UNLIMITED_POLY (sym) + && CLASS_DATA (sym) && CLASS_DATA (sym)->ts.u.derived && !gfc_type_is_extensible (CLASS_DATA (sym)->ts.u.derived)) { @@ -16068,7 +16069,8 @@ resolve_symbol (gfc_symbol *sym) specification_expr = saved_specification_expr; } - if (sym->ts.type == BT_CLASS && sym->attr.class_ok && sym->ts.u.derived) + if (sym->ts.type == BT_CLASS && sym->attr.class_ok && sym->ts.u.derived + && CLASS_DATA (sym)) { as = CLASS_DATA (sym)->as; class_attr = CLASS_DATA (sym)->attr; diff --git a/gcc/testsuite/gfortran.dg/pr95710.f90 b/gcc/testsuite/gfortran.dg/pr95710.f90 new file mode 100644 index 000000000000..566c38d0a9d0 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr95710.f90 @@ -0,0 +1,17 @@ +! { dg-do compile } +! PR fortran/95710 - ICE on duplicate declaration of class variable +! Contributed by G.Steinmetz + +module m + interface + module function s() + end + end interface +end +submodule(m) m2 +contains + module function s() + class(*), allocatable :: x + class(*), allocatable :: x ! { dg-error "Unclassifiable statement" } + end +end