aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTobias Burnus <tobias@codesourcery.com>2023-03-23 14:29:00 +0100
committerTobias Burnus <tobias@codesourcery.com>2023-03-23 14:29:00 +0100
commit9c18db65914a751e4a1d9330ccc1659fe5ef270d (patch)
tree04d942594ccf4b8e17e0caeb525ff2574646efb4 /gcc
parent8ea805840200f7dfd2c11b37abf5fbfe479c2fe2 (diff)
downloadgcc-9c18db65914a751e4a1d9330ccc1659fe5ef270d.zip
gcc-9c18db65914a751e4a1d9330ccc1659fe5ef270d.tar.gz
gcc-9c18db65914a751e4a1d9330ccc1659fe5ef270d.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.omp5
-rw-r--r--gcc/fortran/class.cc5
-rw-r--r--gcc/fortran/resolve.cc3
3 files changed, 11 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog.omp b/gcc/fortran/ChangeLog.omp
index 663102d..f7d1f91 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 35dc35d..7ab6923 100644
--- a/gcc/fortran/class.cc
+++ b/gcc/fortran/class.cc
@@ -2550,6 +2550,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;
@@ -2590,7 +2593,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 aaeaf39..15db125 100644
--- a/gcc/fortran/resolve.cc
+++ b/gcc/fortran/resolve.cc
@@ -15173,7 +15173,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