[PATCH,fortran] Fix Bug 101760 - [13/14/15/16 Regression] ICE in make_ssa_name_fn ...

Jerry D <[email protected]>
Newsgroups gmane.comp.gcc.patches,gmane.comp.gcc.fortran
Message-ID <[email protected]>
I all, the attached patch fixes this ICE.

I do not know if we are in the OK window for this.

Regression tested on x86_64.

OK for mainline?

Regards,

Jerry
---

fortran: Fix ICE in remap_type with deferred-length character
  in OMP target [PR101760, PR102314]

For deferred-length character types such as character(:), allocatable,
TYPE_SIZE and TYPE_SIZE_UNIT contain SAVE_EXPRs wrapping the string
length variable (created by variable_size in finalize_type_size).
In gfc_omp_finish_clause, when computing OMP_CLAUSE_SIZE for implicitly
mapped variables, the code previously used TYPE_SIZE_UNIT directly.
Gimplifying this shared SAVE_EXPR resolves it in place, embedding a
gimple temporary into the type's size expression.  When the enclosing
function is later inlined, remap_type_1 walks TYPE_SIZE and encounters
the stale temporary as an unmappable SSA name, causing an ICE in
make_ssa_name_fn.

Fix by computing the clause size from the array domain bounds and
element size rather than using the type's SAVE_EXPR directly, so
that the type's size expressions remain untouched.

	PR fortran/101760
	PR fortran/102314

gcc/fortran/ChangeLog:

	* trans-openmp.cc (gfc_omp_finish_clause): Compute OMP_CLAUSE_SIZE
	from the array domain bounds and element size for VLA types instead
	of using TYPE_SIZE_UNIT directly, to avoid corrupting the type.

gcc/testsuite/ChangeLog:

	* gfortran.dg/gomp/pr101760.f90: New test.
	* gfortran.dg/gomp/pr102314.f90: New test.

Signed-off-by: Christopher Albert <[email protected]>
pr101760.diff (text/x-patch, 4.9 KB)
From 55be263a7ce0857276e5b26d5bdc1498b8bdc7ff Mon Sep 17 00:00:00 2001
From: Christopher Albert <[email protected]>
Date: Sat, 11 Apr 2026 15:13:19 +0200
Subject: [PATCH] fortran: Fix ICE in remap_type with deferred-length character
 in OMP target [PR101760, PR102314]

For deferred-length character types such as character(:), allocatable,
TYPE_SIZE and TYPE_SIZE_UNIT contain SAVE_EXPRs wrapping the string
length variable (created by variable_size in finalize_type_size).
In gfc_omp_finish_clause, when computing OMP_CLAUSE_SIZE for implicitly
mapped variables, the code previously used TYPE_SIZE_UNIT directly.
Gimplifying this shared SAVE_EXPR resolves it in place, embedding a
gimple temporary into the type's size expression.  When the enclosing
function is later inlined, remap_type_1 walks TYPE_SIZE and encounters
the stale temporary as an unmappable SSA name, causing an ICE in
make_ssa_name_fn.

Fix by computing the clause size from the array domain bounds and
element size rather than using the type's SAVE_EXPR directly, so
that the type's size expressions remain untouched.

	PR fortran/101760
	PR fortran/102314

gcc/fortran/ChangeLog:

	* trans-openmp.cc (gfc_omp_finish_clause): Compute OMP_CLAUSE_SIZE
	from the array domain bounds and element size for VLA types instead
	of using TYPE_SIZE_UNIT directly, to avoid corrupting the type.

gcc/testsuite/ChangeLog:

	* gfortran.dg/gomp/pr101760.f90: New test.
	* gfortran.dg/gomp/pr102314.f90: New test.

Signed-off-by: Christopher Albert <[email protected]>
---
 gcc/fortran/trans-openmp.cc                 | 36 +++++++++++++++++++--
 gcc/testsuite/gfortran.dg/gomp/pr101760.f90 | 14 ++++++++
 gcc/testsuite/gfortran.dg/gomp/pr102314.f90 | 19 +++++++++++
 3 files changed, 66 insertions(+), 3 deletions(-)
 create mode 100644 gcc/testsuite/gfortran.dg/gomp/pr101760.f90
 create mode 100644 gcc/testsuite/gfortran.dg/gomp/pr102314.f90

diff --git a/gcc/fortran/trans-openmp.cc b/gcc/fortran/trans-openmp.cc
index 230395f9d2c..538ba045530 100644
--- a/gcc/fortran/trans-openmp.cc
+++ b/gcc/fortran/trans-openmp.cc
@@ -1839,9 +1839,39 @@ gfc_omp_finish_clause (tree c, gimple_seq *pre_p, bool openacc)
   else
     {
       if (OMP_CLAUSE_SIZE (c) == NULL_TREE)
-	OMP_CLAUSE_SIZE (c)
-	  = DECL_P (decl) ? DECL_SIZE_UNIT (decl)
-			  : TYPE_SIZE_UNIT (TREE_TYPE (decl));
+	{
+	  if (DECL_P (decl))
+	    OMP_CLAUSE_SIZE (c) = DECL_SIZE_UNIT (decl);
+	  else
+	    {
+	      tree type = TREE_TYPE (decl);
+	      tree size = TYPE_SIZE_UNIT (type);
+	      /* For variable-length character types, TYPE_SIZE_UNIT is a
+		 SAVE_EXPR.  Gimplifying the SAVE_EXPR (here or elsewhere)
+		 resolves it in place, embedding a gimple temporary that
+		 later causes an ICE in remap_type during inlining because
+		 the temporary is not in scope (PR101760, PR102314).
+		 Compute the size from the array domain and element size
+		 to decouple completely from the type's SAVE_EXPRs.  */
+	      if (size
+		  && TREE_CODE (type) == ARRAY_TYPE
+		  && TYPE_DOMAIN (type)
+		  && TYPE_MAX_VALUE (TYPE_DOMAIN (type))
+		  && !TREE_CONSTANT (TYPE_MAX_VALUE (TYPE_DOMAIN (type))))
+		{
+		  tree len = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
+		  tree lb = TYPE_MIN_VALUE (TYPE_DOMAIN (type));
+		  tree eltsz = TYPE_SIZE_UNIT (TREE_TYPE (type));
+		  len = fold_build2 (MINUS_EXPR, TREE_TYPE (len), len, lb);
+		  len = fold_build2 (PLUS_EXPR, TREE_TYPE (len), len,
+				     build_one_cst (TREE_TYPE (len)));
+		  size = fold_build2 (MULT_EXPR, sizetype,
+				      fold_convert (sizetype, len),
+				      fold_convert (sizetype, eltsz));
+		}
+	      OMP_CLAUSE_SIZE (c) = size;
+	    }
+	}
 
       tree type = TREE_TYPE (decl);
       if (POINTER_TYPE_P (type) && POINTER_TYPE_P (TREE_TYPE (type)))
diff --git a/gcc/testsuite/gfortran.dg/gomp/pr101760.f90 b/gcc/testsuite/gfortran.dg/gomp/pr101760.f90
new file mode 100644
index 00000000000..ab7bf515a8c
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/gomp/pr101760.f90
@@ -0,0 +1,14 @@
+! PR fortran/101760
+! { dg-do compile }
+! { dg-options "-fopenmp -O1" }
+
+! Verify that deferred-length character variables with the TARGET attribute
+! in OpenMP target regions do not ICE during inlining.
+
+program p
+   character(:), allocatable, target :: x
+   logical :: l
+   !$omp target map(from: l)
+   l = allocated (x)
+   !$omp end target
+end
diff --git a/gcc/testsuite/gfortran.dg/gomp/pr102314.f90 b/gcc/testsuite/gfortran.dg/gomp/pr102314.f90
new file mode 100644
index 00000000000..6e8a45487f3
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/gomp/pr102314.f90
@@ -0,0 +1,19 @@
+! PR fortran/102314
+! { dg-do compile }
+! { dg-options "-fopenmp -O2" }
+
+! Verify that deferred-length character allocatables used inside
+! OpenMP target regions do not ICE during SSA verification or inlining.
+
+program p
+   character(:), allocatable :: y
+   call s(y)
+   !$omp target
+   y = 'abc'
+   !$omp end target
+contains
+   subroutine s(x)
+      character(:), allocatable :: x
+      x = '123'
+   end
+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.