https://gcc.gnu.org/g:1d16782a766400637ae571206799ae451b7a4496

commit 1d16782a766400637ae571206799ae451b7a4496
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Sat May 31 18:01:10 2025 +0200

    Correction régression bind-c-contiguous-1

Diff:
---
 gcc/fortran/trans-decl.cc | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/gcc/fortran/trans-decl.cc b/gcc/fortran/trans-decl.cc
index aae0c26ab8fd..8cefe50699ff 100644
--- a/gcc/fortran/trans-decl.cc
+++ b/gcc/fortran/trans-decl.cc
@@ -7826,6 +7826,7 @@ gfc_generate_function_code (gfc_namespace * ns)
        fsym->backend_decl = NULL;
        tree type = gfc_sym_type (fsym);
        gcc_assert (POINTER_TYPE_P (type));
+       tree desc_type = TREE_TYPE (type);
        if (POINTER_TYPE_P (TREE_TYPE (type)))
          /* For instance, allocatable scalars.  */
          type = TREE_TYPE (type);
@@ -7857,6 +7858,31 @@ gfc_generate_function_code (gfc_namespace * ns)
          }
        fsym->backend_decl = desc_p;
        gfc_conv_cfi_to_gfc (&init, &cleanup, tmp, desc, fsym);
+       if (GFC_DESCRIPTOR_TYPE_P (desc_type)
+           && TYPE_LANG_SPECIFIC (desc_type))
+         {
+           if (GFC_TYPE_ARRAY_ELEM_LEN (desc_type)
+               && TREE_CODE (GFC_TYPE_ARRAY_ELEM_LEN (desc_type)) == SAVE_EXPR)
+             GFC_TYPE_ARRAY_ELEM_LEN (desc_type) =
+                             gfc_evaluate_now (GFC_TYPE_ARRAY_ELEM_LEN 
(desc_type),
+                                               &init);
+
+           if (GFC_TYPE_ARRAY_OFFSET (desc_type)
+               && TREE_CODE (GFC_TYPE_ARRAY_OFFSET (desc_type)) == SAVE_EXPR)
+             GFC_TYPE_ARRAY_OFFSET (desc_type)
+                             = gfc_evaluate_now (GFC_TYPE_ARRAY_OFFSET 
(desc_type),
+                                                 &init);
+                                   
+
+           if (GFC_TYPE_ARRAY_RANK (desc_type) > 0)
+             for (int i = 0; i < GFC_TYPE_ARRAY_RANK (desc_type); i++)
+               if (GFC_TYPE_ARRAY_SPACING (desc_type, i)
+                   && TREE_CODE (GFC_TYPE_ARRAY_SPACING (desc_type, i))
+                      == SAVE_EXPR)
+                 GFC_TYPE_ARRAY_SPACING (desc_type, i)
+                         = gfc_evaluate_now (GFC_TYPE_ARRAY_SPACING 
(desc_type, i),
+                                             &init);
+         }
       }
 
   /* For OpenMP, ensure that declare variant in INTERFACE is is processed

Reply via email to