https://gcc.gnu.org/g:54c89b247a9277fd96c507e8f17d995438c39641

commit 54c89b247a9277fd96c507e8f17d995438c39641
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Fri May 30 22:16:46 2025 +0200

    Correction régression deferred_type_component_3

Diff:
---
 gcc/fortran/trans.cc | 28 ++++++++++++++++++++++------
 1 file changed, 22 insertions(+), 6 deletions(-)

diff --git a/gcc/fortran/trans.cc b/gcc/fortran/trans.cc
index a4793d602435..43a1f17e4fa0 100644
--- a/gcc/fortran/trans.cc
+++ b/gcc/fortran/trans.cc
@@ -1879,8 +1879,12 @@ gfc_deallocate_with_status (tree pointer, tree status, 
tree errmsg,
                            omp_tmp, tmp);
        }
       gfc_add_expr_to_block (&non_null, tmp);
-      gfc_add_modify (&non_null, pointer, build_int_cst (TREE_TYPE (pointer),
-                                                        0));
+      if (descr)
+       gfc_conv_descriptor_data_set (&non_null, descr,
+                                     build_int_cst (ptr_type_node, 0));
+      else
+       gfc_add_modify (&non_null, pointer,
+                       build_int_cst (TREE_TYPE (pointer), 0));
       if (flag_openmp_allocators && descr)
        gfc_conv_descriptor_version_set (&non_null, descr, integer_zero_node);
 
@@ -1946,10 +1950,19 @@ gfc_deallocate_with_status (tree pointer, tree status, 
tree errmsg,
       if (status != NULL_TREE)
        {
          tree stat = build_fold_indirect_ref_loc (input_location, status);
-         tree nullify = fold_build2_loc (input_location, MODIFY_EXPR,
-                                         void_type_node, pointer,
-                                         build_int_cst (TREE_TYPE (pointer),
-                                                        0));
+         tree nullify;
+         if (descr)
+           {
+             stmtblock_t blk;
+             gfc_init_block (&blk);
+             gfc_conv_descriptor_data_set (&blk, descr,
+                                           build_int_cst (ptr_type_node, 0));
+             nullify = gfc_finish_block (&blk);
+           }
+         else
+           nullify = fold_build2_loc (input_location, MODIFY_EXPR,
+                                      void_type_node, pointer,
+                                      build_int_cst (TREE_TYPE (pointer), 0));
 
          TREE_USED (label_finish) = 1;
          tmp = build1_v (GOTO_EXPR, label_finish);
@@ -1960,6 +1973,9 @@ gfc_deallocate_with_status (tree pointer, tree status, 
tree errmsg,
                                 tmp, nullify);
          gfc_add_expr_to_block (&non_null, tmp);
        }
+      else if (descr)
+       gfc_conv_descriptor_data_set (&non_null, descr,
+                                     build_int_cst (ptr_type_node, 0));
       else
        gfc_add_modify (&non_null, pointer, build_int_cst (TREE_TYPE (pointer),
                                                           0));

Reply via email to