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

commit e10f6194f7c040a6254a1712999fafda5b7394b0
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 450a30871577..b3ebc056e4cf 100644
--- a/gcc/fortran/trans-decl.cc
+++ b/gcc/fortran/trans-decl.cc
@@ -5113,10 +5113,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 e7cccb6b0bca..f0ad42c92ead 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