aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/class.c
diff options
context:
space:
mode:
authorHarald Anlauf <anlauf@gmx.de>2020-07-10 21:35:35 +0200
committerHarald Anlauf <anlauf@gmx.de>2020-07-10 21:35:35 +0200
commit70c884a4b82733027ac0e2620d09169b177080d7 (patch)
treefefa915f1be0e6bc5831048847ba1abb56d7eec5 /gcc/fortran/class.c
parent8a0b69f0b089c05d233b8e1a941825b1ceac93bd (diff)
downloadgcc-70c884a4b82733027ac0e2620d09169b177080d7.zip
gcc-70c884a4b82733027ac0e2620d09169b177080d7.tar.gz
gcc-70c884a4b82733027ac0e2620d09169b177080d7.tar.bz2
PR fortran/95980 - ICE in get_unique_type_string, at fortran/class.c:485
In SELECT TYPE, the argument may be an incorrectly specified unlimited CLASS variable. Avoid NULL pointer dereferences for clean error recovery. gcc/fortran/ PR fortran/95980 * class.c (gfc_add_component_ref, gfc_build_class_symbol): Add checks for NULL pointer dereference. * primary.c (gfc_variable_attr): Likewise. * resolve.c (resolve_variable, resolve_assoc_var) (resolve_fl_var_and_proc, resolve_fl_variable_derived) (resolve_symbol): Likewise.
Diffstat (limited to 'gcc/fortran/class.c')
-rw-r--r--gcc/fortran/class.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/gcc/fortran/class.c b/gcc/fortran/class.c
index d6847eb..dfa4840 100644
--- a/gcc/fortran/class.c
+++ b/gcc/fortran/class.c
@@ -228,7 +228,7 @@ gfc_add_component_ref (gfc_expr *e, const char *name)
break;
tail = &((*tail)->next);
}
- if (derived->components && derived->components->next &&
+ if (derived && derived->components && derived->components->next &&
derived->components->next->ts.type == BT_DERIVED &&
derived->components->next->ts.u.derived == NULL)
{
@@ -663,6 +663,10 @@ gfc_build_class_symbol (gfc_typespec *ts, symbol_attribute *attr,
/* Determine the name of the encapsulating type. */
rank = !(*as) || (*as)->rank == -1 ? GFC_MAX_DIMENSIONS : (*as)->rank;
+
+ if (!ts->u.derived)
+ return false;
+
get_unique_hashed_string (tname, ts->u.derived);
if ((*as) && attr->allocatable)
name = xasprintf ("__class_%s_%d_%da", tname, rank, (*as)->corank);