]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fortran: Fix ICE on associate of pointer [PR118789]
authorAndre Vehreschild <vehre@gcc.gnu.org>
Tue, 25 Feb 2025 16:15:47 +0000 (17:15 +0100)
committerAndre Vehreschild <vehre@gcc.gnu.org>
Thu, 27 Feb 2025 08:28:44 +0000 (09:28 +0100)
Fix ICE when associating a pointer to void (c_ptr) by looking at the
compatibility of the type hierarchy.

PR fortran/118789

gcc/fortran/ChangeLog:

* trans-stmt.cc (trans_associate_var): Compare pointed to types when
expr to associate is already a pointer.

gcc/testsuite/ChangeLog:

* gfortran.dg/associate_73.f90: New test.

gcc/fortran/trans-stmt.cc
gcc/testsuite/gfortran.dg/associate_73.f90 [new file with mode: 0644]

index e7da8fea3b24c77b6d9bba95ab0c6f558b11db83..f16e1e3b46e3321a19c12e6695baced48ee79dcc 100644 (file)
@@ -2287,7 +2287,12 @@ trans_associate_var (gfc_symbol *sym, gfc_wrapped_block *block)
                  tmp = se.expr;
                }
            }
-         if (!POINTER_TYPE_P (TREE_TYPE (se.expr)))
+         /* For non-pointer types in se.expr, the first condition holds.
+            For pointer or reference types in se.expr, a double TREE_TYPE ()
+            is possible and an associate variable always is a pointer.  */
+         if (!POINTER_TYPE_P (TREE_TYPE (se.expr))
+             || TREE_TYPE (TREE_TYPE (se.expr))
+                  != TREE_TYPE (TREE_TYPE (sym->backend_decl)))
            tmp = gfc_build_addr_expr (tmp, se.expr);
        }
 
diff --git a/gcc/testsuite/gfortran.dg/associate_73.f90 b/gcc/testsuite/gfortran.dg/associate_73.f90
new file mode 100644 (file)
index 0000000..a5c3ca7
--- /dev/null
@@ -0,0 +1,21 @@
+!{ dg-do compile }
+
+! Check associate to a "void *" does not ICE.
+! Contributed by Matthias Klose  <doko@gcc.gnu.org>
+! and Steve Kargl  <kargls@comcast.net>
+
+module pr118789
+
+   implicit none
+
+   CONTAINS
+
+   subroutine fckit_c_nodelete(cptr) bind(c)
+      use, intrinsic :: iso_c_binding
+      type(c_ptr), value :: cptr
+      associate( unused_ => cptr )
+      end associate
+   end subroutine
+
+end module
+