https://gcc.gnu.org/g:bc45083445b44840e62386ff9ff0a2751f93bcb2

commit bc45083445b44840e62386ff9ff0a2751f93bcb2
Author: Mikael Morin <[email protected]>
Date:   Thu Oct 16 22:28:57 2025 +0200

    Correction régression pr113956.f90

Diff:
---
 gcc/fortran/trans-descriptor.cc | 13 +++++++++++--
 gcc/fortran/trans-intrinsic.cc  |  5 ++++-
 2 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc
index 24a38d26a711..5ab2b98cb059 100644
--- a/gcc/fortran/trans-descriptor.cc
+++ b/gcc/fortran/trans-descriptor.cc
@@ -2343,10 +2343,19 @@ gfc_set_descriptor (stmtblock_t *block, tree dest, tree 
src, gfc_expr *src_expr,
     gfc_conv_descriptor_elem_len_set (block, dest, span);
   else if (src_expr->rank != -1
           && src_expr->ts.type == BT_CHARACTER
-          && src_expr->ts.deferred
           && !element_size_known (dest))
     {
-      tree elem_len = gfc_conv_descriptor_elem_len_get (src);
+      tree src_desc = src;
+      if (TREE_CODE (src_desc) == INDIRECT_REF
+         && DECL_P (TREE_OPERAND (src_desc, 0)))
+       src_desc = TREE_OPERAND (src_desc, 0);
+      if (DECL_P (src_desc)
+         && DECL_LANG_SPECIFIC (src_desc)
+         && GFC_DECL_SAVED_DESCRIPTOR (src_desc))
+       src_desc = GFC_DECL_SAVED_DESCRIPTOR (src_desc);
+      if (POINTER_TYPE_P (TREE_TYPE (src_desc)))
+       src_desc = build_fold_indirect_ref_loc (input_location, src_desc);
+      tree elem_len = gfc_conv_descriptor_elem_len_get (src_desc);
       gfc_conv_descriptor_elem_len_set (block, dest, elem_len);
     }
 
diff --git a/gcc/fortran/trans-intrinsic.cc b/gcc/fortran/trans-intrinsic.cc
index 7c2ec4e14eb5..5c4990bf315e 100644
--- a/gcc/fortran/trans-intrinsic.cc
+++ b/gcc/fortran/trans-intrinsic.cc
@@ -9903,7 +9903,10 @@ gfc_conv_intrinsic_loc (gfc_se * se, gfc_expr * expr)
       gfc_conv_expr_reference (se, arg_expr);
     }
   else
-    gfc_conv_array_parameter (se, arg_expr, true, NULL, NULL, NULL);
+    {
+      se->bytes_strided = true;
+      gfc_conv_array_parameter (se, arg_expr, true, NULL, NULL, NULL);
+    }
   se->expr = convert (gfc_get_int_type (gfc_index_integer_kind), se->expr);
 
   /* Create a temporary variable for loc return value.  Without this,

Reply via email to