diff options
author | Harald Anlauf <anlauf@gmx.de> | 2023-09-22 21:06:00 +0200 |
---|---|---|
committer | Harald Anlauf <anlauf@gmx.de> | 2023-09-23 19:21:19 +0200 |
commit | 767eea9ea22f0247be9a56fd2e1d460ddfbbf6d9 (patch) | |
tree | ffa89749507edbde09d1767889bf468b8cffd2b1 | |
parent | d6679fa2d65316e80a267c94c17ad9e23f433f77 (diff) | |
download | gcc-767eea9ea22f0247be9a56fd2e1d460ddfbbf6d9.zip gcc-767eea9ea22f0247be9a56fd2e1d460ddfbbf6d9.tar.gz gcc-767eea9ea22f0247be9a56fd2e1d460ddfbbf6d9.tar.bz2 |
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.
-rw-r--r-- | gcc/fortran/class.cc | 4 | ||||
-rw-r--r-- | gcc/fortran/resolve.cc | 4 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr95710.f90 | 17 |
3 files changed, 24 insertions, 1 deletions
diff --git a/gcc/fortran/class.cc b/gcc/fortran/class.cc index 9d0c802..5c43b77 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 1042b8c..861f69a 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 0000000..566c38d --- /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 |