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]>
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