Hi all, hi Paul,
you asked me to have a look at PR85510 (which the associate meta bug is blocked
by). I have come up with the cause. The symbol of the coarray is deemed to be
host_associated and therefore the caf_token is not created in the correct scope.
I am not familiar with host-association, so my solution may be wrong. The
essence of my patch is to ensure, that the namespace the symbol is in is not
caused by an associate command. I hope this is the way to go.
Regtests ok on x86_64-pc-linux-gnu / Fedora 39. Ok for mainline?
Regards,
Andre
--
Andre Vehreschild * Email: vehre ad gmx dot de
From 5790f80089f3c4611bd50796ca53ed5437adf012 Mon Sep 17 00:00:00 2001
From: Andre Vehreschild <[email protected]>
Date: Mon, 22 Jul 2024 15:31:37 +0200
Subject: [PATCH] Fortran: Fix coarray in associate not linking [PR85510]
PR fortran/85510
gcc/fortran/ChangeLog:
* resolve.cc (resolve_variable): Mark the variable as host
associated only, when it is not in an associate block.
* trans-decl.cc (generate_coarray_init): Remove incorrect unused
flag on parameter.
gcc/testsuite/ChangeLog:
* gfortran.dg/coarray/pr85510.f90: New test.
---
gcc/fortran/resolve.cc | 10 ++++++----
gcc/fortran/trans-decl.cc | 2 +-
gcc/testsuite/gfortran.dg/coarray/pr85510.f90 | 19 +++++++++++++++++++
3 files changed, 26 insertions(+), 5 deletions(-)
create mode 100644 gcc/testsuite/gfortran.dg/coarray/pr85510.f90
diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc
index 3bf48f793d8..393864a4a03 100644
--- a/gcc/fortran/resolve.cc
+++ b/gcc/fortran/resolve.cc
@@ -6114,10 +6114,12 @@ resolve_variable (gfc_expr *e)
/* If a symbol has been host_associated mark it. This is used latter,
to identify if aliasing is possible via host association. */
if (sym->attr.flavor == FL_VARIABLE
- && gfc_current_ns->parent
- && (gfc_current_ns->parent == sym->ns
- || (gfc_current_ns->parent->parent
- && gfc_current_ns->parent->parent == sym->ns)))
+ && (!sym->ns->code || sym->ns->code->op != EXEC_BLOCK
+ || !sym->ns->code->ext.block.assoc)
+ && gfc_current_ns->parent
+ && (gfc_current_ns->parent == sym->ns
+ || (gfc_current_ns->parent->parent
+ && gfc_current_ns->parent->parent == sym->ns)))
sym->attr.host_assoc = 1;
if (gfc_current_ns->proc_name
diff --git a/gcc/fortran/trans-decl.cc b/gcc/fortran/trans-decl.cc
index 82fa2bb6134..7d23bac6843 100644
--- a/gcc/fortran/trans-decl.cc
+++ b/gcc/fortran/trans-decl.cc
@@ -5912,7 +5912,7 @@ generate_coarray_sym_init (gfc_symbol *sym)
coarrays. */
static void
-generate_coarray_init (gfc_namespace * ns __attribute((unused)))
+generate_coarray_init (gfc_namespace *ns)
{
tree fndecl, tmp, decl, save_fn_decl;
diff --git a/gcc/testsuite/gfortran.dg/coarray/pr85510.f90 b/gcc/testsuite/gfortran.dg/coarray/pr85510.f90
new file mode 100644
index 00000000000..c6777cad6ed
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/coarray/pr85510.f90
@@ -0,0 +1,19 @@
+!{ dg-do run }
+
+! Contributed by Damian Rouson <[email protected]>
+! Check that PR fortran/85510 links.
+
+module foo
+contains
+ subroutine bar()
+ integer, save :: i[*] = 1
+ associate(n=>1)
+ if (i[1] /= 1) stop 1
+ end associate
+ end subroutine
+end module
+
+use foo
+call bar()
+end
+
--
2.45.2