https://gcc.gnu.org/g:2974cdac9f7ceea9e5471d75c5e7e2ae63eaaaed

commit 2974cdac9f7ceea9e5471d75c5e7e2ae63eaaaed
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Wed Feb 12 10:47:31 2025 +0100

    Correction erreurs non-lvalue lhs pr113363.f90

Diff:
---
 gcc/fortran/trans-decl.cc | 21 +++++++++++++++++----
 gcc/fortran/trans.cc      |  4 ++--
 2 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/gcc/fortran/trans-decl.cc b/gcc/fortran/trans-decl.cc
index 17dd93a1f404..a0c13139d93a 100644
--- a/gcc/fortran/trans-decl.cc
+++ b/gcc/fortran/trans-decl.cc
@@ -5110,10 +5110,23 @@ gfc_trans_deferred_vars (gfc_symbol * proc_sym, 
gfc_wrapped_block * block)
                  if (!sym->attr.dummy || sym->attr.intent == INTENT_OUT)
                    {
                      /* Nullify when entering the scope.  */
-                     tmp = fold_build2_loc (input_location, MODIFY_EXPR,
-                                            TREE_TYPE (se.expr), se.expr,
-                                            fold_convert (TREE_TYPE (se.expr),
-                                                          null_pointer_node));
+                     if (sym->ts.type == BT_CLASS
+                         && (CLASS_DATA (sym)->attr.dimension
+                             || CLASS_DATA (sym)->attr.codimension))
+                       {
+                         stmtblock_t nullify;
+                         gfc_init_block (&nullify);
+                         gfc_conv_descriptor_data_set (&nullify, descriptor,
+                                                       null_pointer_node);
+                         tmp = gfc_finish_block (&nullify);
+                       }
+                     else
+                       {
+                         tmp = fold_build2_loc (input_location, MODIFY_EXPR,
+                                                TREE_TYPE (se.expr), se.expr,
+                                                fold_convert (TREE_TYPE 
(se.expr),
+                                                              
null_pointer_node));
+                       }
                      if (sym->attr.optional)
                        {
                          tree present = gfc_conv_expr_present (sym);
diff --git a/gcc/fortran/trans.cc b/gcc/fortran/trans.cc
index 9880726c6113..c72bf8be4198 100644
--- a/gcc/fortran/trans.cc
+++ b/gcc/fortran/trans.cc
@@ -1737,7 +1737,7 @@ gfc_finalize_tree_expr (gfc_se *se, gfc_symbol *derived,
                             gfc_call_free (data_ptr),
                             build_empty_stmt (input_location));
       gfc_add_expr_to_block (&se->loop->post, tmp);
-      gfc_add_modify (&se->loop->post, data_ptr, data_null);
+      gfc_conv_descriptor_data_set (&se->loop->post, desc, data_null);
     }
   else
     {
@@ -1751,7 +1751,7 @@ gfc_finalize_tree_expr (gfc_se *se, gfc_symbol *derived,
                                 gfc_call_free (data_ptr),
                                 build_empty_stmt (input_location));
          gfc_add_expr_to_block (&se->finalblock, tmp);
-         gfc_add_modify (&se->finalblock, data_ptr, data_null);
+         gfc_conv_descriptor_data_set (&se->finalblock, desc, data_null);
        }
     }
 }

Reply via email to