https://gcc.gnu.org/g:18adfe80069d2541a5f3550eef2b51881ec15cde

commit 18adfe80069d2541a5f3550eef2b51881ec15cde
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Wed Feb 12 10:22:42 2025 +0100

    Ajout surcharge gfc_conv_descriptor_type_set

Diff:
---
 gcc/fortran/trans-array.cc | 41 +++++++++++++++++++++++++++++------------
 1 file changed, 29 insertions(+), 12 deletions(-)

diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index 19c6768cc66e..051ccafe9807 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -261,6 +261,15 @@ get_field (tree desc, unsigned field_idx)
   return field;
 }
 
+tree
+get_dtype_subfield (tree desc, unsigned subfield)
+{
+  tree dtype = get_field (desc, DTYPE_FIELD);
+  tree field = gfc_advance_chain (TYPE_FIELDS (TREE_TYPE (dtype)), subfield);
+  gcc_assert (field != NULL_TREE);
+  return field;
+}
+
 tree
 get_component (tree desc, unsigned field_idx)
 {
@@ -518,6 +527,14 @@ conv_type_set (stmtblock_t *block, tree desc, tree value)
                      fold_convert_loc (loc, TREE_TYPE (t), value));
 }
 
+void
+conv_type_set (stmtblock_t *block, tree desc, int value)
+{
+  tree field = get_dtype_subfield (desc, GFC_DTYPE_TYPE);
+  tree val = build_int_cst (TREE_TYPE (field), value);
+  conv_type_set (block, desc, val);
+}
+
 tree
 get_dimensions (tree desc)
 {
@@ -870,6 +887,12 @@ gfc_conv_descriptor_type_set (stmtblock_t *block, tree 
desc, tree value)
   gfc_descriptor::conv_type_set (block, desc, value);
 }
 
+void
+gfc_conv_descriptor_type_set (stmtblock_t *block, tree desc, int value)
+{
+  gfc_descriptor::conv_type_set (block, desc, value);
+}
+
 tree
 gfc_conv_descriptor_token_get (tree desc)
 {
@@ -2536,7 +2559,6 @@ gfc_set_gfc_from_cfi (stmtblock_t *unconditional_block,
       ctype = fold_build2_loc (input_location, BIT_AND_EXPR, TREE_TYPE (ctype),
                               ctype, build_int_cst (TREE_TYPE (ctype),
                                                     CFI_type_mask));
-      tree type = gfc_conv_descriptor_type_get (gfc);
 
       /* if (CFI_type_cptr) BT_VOID else BT_UNKNOWN  */
       /* Note: BT_VOID is could also be CFI_type_funcptr, but assume c_ptr. */
@@ -2545,13 +2567,11 @@ gfc_set_gfc_from_cfi (stmtblock_t *unconditional_block,
 
       stmtblock_t set_void;
       gfc_init_block (&set_void);
-      tree void_value = build_int_cst (TREE_TYPE (type), BT_VOID);
-      gfc_conv_descriptor_type_set (&set_void, gfc, void_value);
+      gfc_conv_descriptor_type_set (&set_void, gfc, BT_VOID);
 
       stmtblock_t set_unknown;
       gfc_init_block (&set_unknown);
-      tree unknown_value = build_int_cst (TREE_TYPE (type), BT_UNKNOWN);
-      gfc_conv_descriptor_type_set (&set_unknown, gfc, unknown_value);
+      gfc_conv_descriptor_type_set (&set_unknown, gfc, BT_UNKNOWN);
 
       tree tmp2 = fold_build3_loc (input_location, COND_EXPR, void_type_node, 
cond,
                                   gfc_finish_block (&set_void),
@@ -2563,8 +2583,7 @@ gfc_set_gfc_from_cfi (stmtblock_t *unconditional_block,
                                             CFI_type_struct));
       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);
+      gfc_conv_descriptor_type_set (&set_derived, gfc, BT_DERIVED);
       tmp2 = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond,
                              gfc_finish_block (&set_derived), tmp2);
 
@@ -2576,8 +2595,7 @@ gfc_set_gfc_from_cfi (stmtblock_t *unconditional_block,
                              CFI_type_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);
+      gfc_conv_descriptor_type_set (&set_character, gfc, BT_CHARACTER);
       tmp2 = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond,
                              gfc_finish_block (&set_character), tmp2);
 
@@ -2591,7 +2609,7 @@ gfc_set_gfc_from_cfi (stmtblock_t *unconditional_block,
                              build_int_cst (TREE_TYPE (tmp),
                                             CFI_type_ucs4_char));
       gfc_init_block (&set_character);
-      gfc_conv_descriptor_type_set (&set_character, gfc, character_value);
+      gfc_conv_descriptor_type_set (&set_character, gfc, BT_CHARACTER);
       tmp2 = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond,
                              gfc_finish_block (&set_character), tmp2);
 
@@ -2601,8 +2619,7 @@ gfc_set_gfc_from_cfi (stmtblock_t *unconditional_block,
                              CFI_type_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);
+      gfc_conv_descriptor_type_set (&set_complex, gfc, BT_COMPLEX);
       tmp2 = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond,
                              gfc_finish_block (&set_complex), tmp2);

Reply via email to