[gcc/devel/omp/gcc-14] Fortran: Add attr.class_ok check for generate_callback_wrapper

Paul-Antoine Arras parras@gcc.gnu.org
Fri Jun 28 09:52:34 GMT 2024


https://gcc.gnu.org/g:1bd79a2f001df20272284d0bd1037d7d5627efe6

commit 1bd79a2f001df20272284d0bd1037d7d5627efe6
Author: Tobias Burnus <tobias@codesourcery.com>
Date:   Thu Mar 23 14:29:00 2023 +0100

    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.

Diff:
---
 gcc/fortran/ChangeLog.omp | 5 +++++
 gcc/fortran/class.cc      | 5 ++++-
 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 4f1e80a42b2..26d69b8081f 100644
--- a/gcc/fortran/ChangeLog.omp
+++ b/gcc/fortran/ChangeLog.omp
@@ -1,3 +1,8 @@
+2023-03-23  Tobias Burnus  <tobias@codesourcery.com>
+
+	* class.cc (generate_callback_wrapper): Add attr.class_ok check.
+	* resolve.cc (resolve_fl_derived): Likewise.
+
 2022-11-02  Tobias Burnus  <tobias@codesourcery.com>
 
 	* trans-openmp.cc (gfc_trans_omp_clauses): Ensure DT struct-comp with
diff --git a/gcc/fortran/class.cc b/gcc/fortran/class.cc
index 987722f601f..15aacd98fd8 100644
--- a/gcc/fortran/class.cc
+++ b/gcc/fortran/class.cc
@@ -2680,6 +2680,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;
@@ -2720,7 +2723,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 3aaeeed1c4f..1f861d9f908 100644
--- a/gcc/fortran/resolve.cc
+++ b/gcc/fortran/resolve.cc
@@ -15945,7 +15945,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


More information about the Gcc-cvs mailing list