diff options
author | Harald Anlauf <anlauf@gmx.de> | 2020-07-10 21:35:35 +0200 |
---|---|---|
committer | Harald Anlauf <anlauf@gmx.de> | 2020-07-10 21:35:35 +0200 |
commit | 70c884a4b82733027ac0e2620d09169b177080d7 (patch) | |
tree | fefa915f1be0e6bc5831048847ba1abb56d7eec5 /gcc/fortran/class.c | |
parent | 8a0b69f0b089c05d233b8e1a941825b1ceac93bd (diff) | |
download | gcc-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.c | 6 |
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); |