[PATCH, fortran] [13/14/15/16 Regression][Ope nACC] '!$acc ... attach(scalar)' – ICE 'unexpe cted pointer mapping node'

Jerry D <[email protected]>
Newsgroups gmane.comp.gcc.patches,gmane.comp.gcc.fortran
Message-ID <[email protected]>
The attached patch here regression tested on x86_64 with make check-fortran.

PASS: gfortran.dg/goacc/pr120723.f90   -O  (test for excess errors)
PASS: gfortran.dg/goacc/pr120723.f90   -O   scan-tree-dump-times original 
"(?n)#pragma acc enter data map\\(attach:a \\[bias: 0\\]\\) map\\(attach:c 
\\[bias: 0\\]\\);$" 1
PASS: gfortran.dg/goacc/pr120723.f90   -O   scan-tree-dump-times original 
"(?n)#pragma acc exit data map\\(detach:a \\[bias: 0\\]\\) map\\(detach:c 
\\[bias: 0\\]\\);$" 1

OK for mainline and later backport?

 From 5fae5d7c4e9c25d18c52a14d5ff8779030908ff5 Mon Sep 17 00:00:00 2001
From: Christopher Albert <[email protected]>
Date: Tue, 10 Mar 2026 23:26:13 +0100
Subject: [PATCH] fortran: Fix scalar OpenACC attach/detach lowering [PR120723]

Lower bare scalar OpenACC attach/detach clauses as direct attach operations 
instead of emitting standalone pointer-mapping nodes.

	PR fortran/120723

gcc/fortran/ChangeLog:

	* trans-openmp.cc (gfc_trans_omp_clauses): Handle bare scalar
	OpenACC attach/detach clauses without pointer-mapping nodes.

gcc/testsuite/ChangeLog:

	* gfortran.dg/goacc/pr120723.f90: New test.

Signed-off-by: Christopher Albert <[email protected]>
---
pr120723.diff (text/x-patch, 3.5 KB)
From 5fae5d7c4e9c25d18c52a14d5ff8779030908ff5 Mon Sep 17 00:00:00 2001
From: Christopher Albert <[email protected]>
Date: Tue, 10 Mar 2026 23:26:13 +0100
Subject: [PATCH] fortran: Fix scalar OpenACC attach/detach lowering [PR120723]

Lower bare scalar OpenACC attach/detach clauses as direct attach operations instead of emitting standalone pointer-mapping nodes.

	PR fortran/120723

gcc/fortran/ChangeLog:

	* trans-openmp.cc (gfc_trans_omp_clauses): Handle bare scalar
	OpenACC attach/detach clauses without pointer-mapping nodes.

gcc/testsuite/ChangeLog:

	* gfortran.dg/goacc/pr120723.f90: New test.

Signed-off-by: Christopher Albert <[email protected]>
---
 gcc/fortran/trans-openmp.cc                  | 20 ++++++++++++++++++++
 gcc/testsuite/gfortran.dg/goacc/pr120723.f90 | 20 ++++++++++++++++++++
 2 files changed, 40 insertions(+)
 create mode 100644 gcc/testsuite/gfortran.dg/goacc/pr120723.f90

diff --git a/gcc/fortran/trans-openmp.cc b/gcc/fortran/trans-openmp.cc
index 3dd4cf272e5..660d56385bb 100644
--- a/gcc/fortran/trans-openmp.cc
+++ b/gcc/fortran/trans-openmp.cc
@@ -4400,6 +4400,14 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses,
 				       != BT_VOID))))
 		    {
 		      tree orig_decl = decl;
+		      bool bare_attach_detach
+			= (openacc
+			   && (n->u.map.op == OMP_MAP_ATTACH
+			       || n->u.map.op == OMP_MAP_DETACH)
+			   && !GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (decl))
+			   && !(POINTER_TYPE_P (TREE_TYPE (decl))
+				&& GFC_DESCRIPTOR_TYPE_P (TREE_TYPE
+							  (TREE_TYPE (decl)))));
 
 		      /* For nonallocatable, nonpointer arrays, a temporary
 			 variable is generated, but this one is only defined if
@@ -4424,6 +4432,18 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses,
 							     cond, tmp,
 							     NULL_TREE));
 			}
+		      /* Bare OpenACC attach/detach on scalar pointer-like
+			 variables wants a single attach operation on the
+			 pointer itself, not a standalone pointer-mapping
+			 node.  Component and descriptor cases have dedicated
+			 handling below; this covers the plain scalar path.  */
+		      if (bare_attach_detach)
+			{
+			  decl = build_fold_indirect_ref (decl);
+			  OMP_CLAUSE_DECL (node) = build_fold_addr_expr (decl);
+			  OMP_CLAUSE_SIZE (node) = size_zero_node;
+			  goto finalize_map_clause;
+			}
 		      /* For descriptor types, the unmapping happens below.  */
 		      if (op != EXEC_OMP_TARGET_EXIT_DATA
 			  || !GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (decl)))
diff --git a/gcc/testsuite/gfortran.dg/goacc/pr120723.f90 b/gcc/testsuite/gfortran.dg/goacc/pr120723.f90
new file mode 100644
index 00000000000..606dcbd4f2f
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/pr120723.f90
@@ -0,0 +1,20 @@
+! { dg-do compile }
+! { dg-additional-options "-fdump-tree-original" }
+!
+! PR fortran/120723 - scalar OpenACC attach/detach must not lower through a
+! standalone pointer-mapping node.
+
+implicit none (type, external)
+integer, pointer :: a, b(:)
+integer, allocatable :: c, d(:)
+
+! Scalar pointer and allocatable items used to ICE here.
+!$acc enter data attach(a, c)
+!$acc enter data attach(b, d)
+!$acc exit data detach(a, c)
+!$acc exit data detach(b, d)
+
+! { dg-final { scan-tree-dump-times "(?n)#pragma acc enter data map\\(attach:a \\\[bias: 0\\\]\\) map\\(attach:c \\\[bias: 0\\\]\\);$" 1 "original" } }
+! { dg-final { scan-tree-dump-times "(?n)#pragma acc exit data map\\(detach:a \\\[bias: 0\\\]\\) map\\(detach:c \\\[bias: 0\\\]\\);$" 1 "original" } }
+
+end
-- 
2.53.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.