https://gcc.gnu.org/g:4a28165e7ee06dd33051f960a851e5cffca025bd

commit 4a28165e7ee06dd33051f960a851e5cffca025bd
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Wed Feb 12 10:07:40 2025 +0100

    Correction non_lvalue PR97046.f90

Diff:
---
 gcc/fortran/trans-array.cc | 42 +++++++++++++++++++++++++++---------------
 1 file changed, 27 insertions(+), 15 deletions(-)

diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index e52a87653505..460c7ce6037f 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -2570,24 +2570,31 @@ gfc_set_gfc_from_cfi (stmtblock_t *unconditional_block,
       tree tmp2 = fold_build3_loc (input_location, COND_EXPR, void_type_node, 
cond,
                                   gfc_finish_block (&set_void),
                                   gfc_finish_block (&set_unknown));
+
       /* if (CFI_type_struct) BT_DERIVED else  < tmp2 >  */
       cond = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node, 
ctype,
                              build_int_cst (TREE_TYPE (ctype),
                                             CFI_type_struct));
-      tmp = fold_build2_loc (input_location, MODIFY_EXPR, void_type_node, type,
-                            build_int_cst (TREE_TYPE (type), BT_DERIVED));
+      stmtblock_t set_derived;
+      gfc_init_block (&set_derived);
+      tree derived_value = build_int_cst (TREE_TYPE (type), BT_DERIVED);
+      gfc_conv_descriptor_type_set (&set_derived, gfc, derived_value);
       tmp2 = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond,
-                             tmp, tmp2);
+                             gfc_finish_block (&set_derived), tmp2);
+
       /* if (CFI_type_Character) BT_CHARACTER else  < tmp2 >  */
       /* Note: this is kind=1, CFI_type_ucs4_char is handled in the 'else if'
         before (see below, as generated bottom up).  */
       cond = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node, 
ctype,
                              build_int_cst (TREE_TYPE (ctype),
                              CFI_type_Character));
-      tmp = fold_build2_loc (input_location, MODIFY_EXPR, void_type_node, type,
-                            build_int_cst (TREE_TYPE (type), BT_CHARACTER));
+      stmtblock_t set_character;
+      gfc_init_block (&set_character);
+      tree character_value = build_int_cst (TREE_TYPE (type), BT_CHARACTER);
+      gfc_conv_descriptor_type_set (&set_character, gfc, character_value);
       tmp2 = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond,
-                             tmp, tmp2);
+                             gfc_finish_block (&set_character), tmp2);
+
       /* if (CFI_type_ucs4_char) BT_CHARACTER else  < tmp2 >  */
       /* Note: gfc->elem_len = cfi->elem_len/4.  */
       /* However, assuming that CFI_type_ucs4_char cannot be recovered, leave
@@ -2597,18 +2604,22 @@ gfc_set_gfc_from_cfi (stmtblock_t *unconditional_block,
       cond = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node, tmp,
                              build_int_cst (TREE_TYPE (tmp),
                                             CFI_type_ucs4_char));
-      tmp = fold_build2_loc (input_location, MODIFY_EXPR, void_type_node, type,
-                            build_int_cst (TREE_TYPE (type), BT_CHARACTER));
+      gfc_init_block (&set_character);
+      gfc_conv_descriptor_type_set (&set_character, gfc, character_value);
       tmp2 = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond,
-                             tmp, tmp2);
+                             gfc_finish_block (&set_character), tmp2);
+
       /* if (CFI_type_Complex) BT_COMPLEX + cfi->elem_len/2 else  < tmp2 >  */
       cond = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node, 
ctype,
                              build_int_cst (TREE_TYPE (ctype),
                              CFI_type_Complex));
-      tmp = fold_build2_loc (input_location, MODIFY_EXPR, void_type_node, type,
-                            build_int_cst (TREE_TYPE (type), BT_COMPLEX));
+      stmtblock_t set_complex;
+      gfc_init_block (&set_complex);
+      tree complex_value = build_int_cst (TREE_TYPE (type), BT_COMPLEX);
+      gfc_conv_descriptor_type_set (&set_complex, gfc, complex_value);
       tmp2 = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond,
-                             tmp, tmp2);
+                             gfc_finish_block (&set_complex), tmp2);
+
       /* if (CFI_type_Integer || CFI_type_Logical || CFI_type_Real)
           ctype else  <tmp2>  */
       cond = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node, 
ctype,
@@ -2624,10 +2635,11 @@ gfc_set_gfc_from_cfi (stmtblock_t *unconditional_block,
                                             CFI_type_Real));
       cond = fold_build2_loc (input_location, TRUTH_OR_EXPR, boolean_type_node,
                              cond, tmp);
-      tmp = fold_build2_loc (input_location, MODIFY_EXPR, void_type_node,
-                            type, fold_convert (TREE_TYPE (type), ctype));
+      stmtblock_t set_ctype;
+      gfc_init_block (&set_ctype);
+      gfc_conv_descriptor_type_set (&set_ctype, gfc, ctype);
       tmp2 = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond,
-                             tmp, tmp2);
+                             gfc_finish_block (&set_ctype), tmp2);
       gfc_add_expr_to_block (unconditional_block, tmp2);
     }

Reply via email to