[Bug fortran/99138] ICE in gfc_match_rvalue, at fortran/primary.c:3738

anlauf at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Mon Mar 15 21:56:18 GMT 2021


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;


More information about the Gcc-bugs mailing list