https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99138
anlauf at gcc dot gnu.org changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |anlauf at gcc dot gnu.org --- Comment #6 from anlauf at gcc dot gnu.org --- The following patch fixes several NULL pointer dereferences exhibited by the testcases in comment#0 and comment#5: diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c index a6df885c80c..153e9037127 100644 --- a/gcc/fortran/primary.c +++ b/gcc/fortran/primary.c @@ -3714,7 +3714,7 @@ gfc_match_rvalue (gfc_expr **result) e->where = gfc_current_locus; if (sym->ts.type == BT_CLASS && sym->attr.class_ok - && CLASS_DATA (sym)->as) + && CLASS_DATA (sym) && CLASS_DATA (sym)->as) e->rank = CLASS_DATA (sym)->as->rank; else if (sym->as != NULL) e->rank = sym->as->rank; diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 32015c21efc..59870bbd502 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -8902,6 +8902,8 @@ resolve_select (gfc_code *code, bool select_type) bool gfc_type_is_extensible (gfc_symbol *sym) { + if (sym == NULL) + return false; return !(sym->attr.is_bind_c || sym->attr.sequence || (sym->attr.is_class && sym->components->ts.u.derived->attr.unlimited_polymorphic)); @@ -12747,6 +12749,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) && !gfc_type_is_extensible (CLASS_DATA (sym)->ts.u.derived)) { gfc_error ("Type %qs of CLASS variable %qs at %L is not extensible", @@ -15432,7 +15435,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;