diff options
author | Tobias Burnus <tobias@codesourcery.com> | 2023-03-23 14:29:00 +0100 |
---|---|---|
committer | Kwok Cheung Yeung <kcy@codesourcery.com> | 2023-05-18 16:11:55 +0100 |
commit | 15cc37fdb0241e388bca0ea4270fd94e7517f391 (patch) | |
tree | 6359786bd561259b8f708700701e80a14fffc74d /gcc | |
parent | c3d63305f75ac35fe5c6bad263a3c3084f280a0e (diff) | |
download | gcc-15cc37fdb0241e388bca0ea4270fd94e7517f391.zip gcc-15cc37fdb0241e388bca0ea4270fd94e7517f391.tar.gz gcc-15cc37fdb0241e388bca0ea4270fd94e7517f391.tar.bz2 |
Fortran: Add attr.class_ok check for generate_callback_wrapper
Proper variables/components of type BT_CLASS have 'class_ok' set; check
for that to avoid an ICE on invalid code for gfortran.dg/pr108434.f90.
gcc/fortran/
* class.cc (generate_callback_wrapper): Add attr.class_ok check.
* resolve.cc (resolve_fl_derived): Likewise.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog.omp | 5 | ||||
-rw-r--r-- | gcc/fortran/class.cc | 5 | ||||
-rw-r--r-- | gcc/fortran/resolve.cc | 3 |
3 files changed, 11 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog.omp b/gcc/fortran/ChangeLog.omp index bbbd822..a13fedc 100644 --- a/gcc/fortran/ChangeLog.omp +++ b/gcc/fortran/ChangeLog.omp @@ -1,5 +1,10 @@ 2023-03-23 Tobias Burnus <tobias@codesourcery.com> + * class.cc (generate_callback_wrapper): Add attr.class_ok check. + * resolve.cc (resolve_fl_derived): Likewise. + +2023-03-23 Tobias Burnus <tobias@codesourcery.com> + * trans-openmp.cc (gfc_trans_omp_clauses): Fix unmapping of GOMP_MAP_POINTER for scalar allocatables/pointers. diff --git a/gcc/fortran/class.cc b/gcc/fortran/class.cc index 40f3095..5e75e20 100644 --- a/gcc/fortran/class.cc +++ b/gcc/fortran/class.cc @@ -2626,6 +2626,9 @@ generate_callback_wrapper (gfc_symbol *vtab, gfc_symbol *derived, cb (token, comp->var(.data), size, 0, var's cb fn); */ for (gfc_component *comp = derived->components; comp; comp = comp->next) { + if (__builtin_expect (comp->ts.type == BT_CLASS + && !comp->attr.class_ok, 0)) + continue; bool pointer = (comp->ts.type == BT_CLASS ? CLASS_DATA (comp)->attr.pointer : comp->attr.pointer); bool proc_ptr = comp->attr.proc_pointer; @@ -2666,7 +2669,7 @@ generate_callback_wrapper (gfc_symbol *vtab, gfc_symbol *derived, size->where = gfc_current_locus; } - if (!proc_ptr && comp->ts.type == BT_CLASS) + if (!proc_ptr && comp->ts.type == BT_CLASS && comp->attr.class_ok) { gfc_add_data_component (expr); if (comp->attr.dimension) diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc index d9064be..545f0fb 100644 --- a/gcc/fortran/resolve.cc +++ b/gcc/fortran/resolve.cc @@ -15525,7 +15525,8 @@ resolve_fl_derived (gfc_symbol *sym) gfc_component *c = (sym->attr.is_class ? CLASS_DATA (sym->components) : sym->components); for ( ; c; c = c->next) - if ((c->ts.type == BT_DERIVED || c->ts.type == BT_CLASS) + if ((c->ts.type == BT_DERIVED + || (c->ts.type == BT_CLASS && c->attr.class_ok)) && !c->ts.u.derived->resolve_symbol_called) { if (c->ts.u.derived->components == NULL |