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

commit 4a8163325ac5b79fb869baee36ffefd656c445ee
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Tue Feb 11 10:36:20 2025 +0100

    Correction ICE coarray_42.f90

Diff:
---
 gcc/fortran/trans-array.cc     | 33 +++++++++++++++++++++++++++------
 gcc/fortran/trans-array.h      |  1 +
 gcc/fortran/trans-intrinsic.cc |  4 +---
 3 files changed, 29 insertions(+), 9 deletions(-)

diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index f0dadfbe58fc..7072927a30be 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -258,6 +258,14 @@ get_field (tree desc, unsigned field_idx)
   tree field = gfc_advance_chain (TYPE_FIELDS (type), field_idx);
   gcc_assert (field != NULL_TREE);
 
+  return field;
+}
+
+tree
+get_component (tree desc, unsigned field_idx)
+{
+  tree field = get_field (desc, field_idx);
+
   return fold_build3_loc (input_location, COMPONENT_REF, TREE_TYPE (field),
                          desc, field, NULL_TREE);
 }
@@ -265,7 +273,7 @@ get_field (tree desc, unsigned field_idx)
 tree
 get_data (tree desc)
 {
-  return get_field (desc, DATA_FIELD);
+  return get_component (desc, DATA_FIELD);
 }
 
 tree
@@ -296,7 +304,7 @@ conv_data_addr (tree desc)
 tree
 get_offset (tree desc)
 {
-  tree field = get_field (desc, OFFSET_FIELD);
+  tree field = get_component (desc, OFFSET_FIELD);
   gcc_assert (TREE_TYPE (field) == gfc_array_index_type);
   return field;
 }
@@ -317,7 +325,7 @@ conv_offset_set (stmtblock_t *block, tree desc, tree value)
 tree
 get_dtype (tree desc)
 {
-  tree field = get_field (desc, DTYPE_FIELD);
+  tree field = get_component (desc, DTYPE_FIELD);
   gcc_assert (TREE_TYPE (field) == get_dtype_type_node ());
   return field;
 }
@@ -338,7 +346,7 @@ conv_dtype_set (stmtblock_t *block, tree desc, tree val)
 tree
 get_span (tree desc)
 {
-  tree field = get_field (desc, SPAN_FIELD);
+  tree field = get_component (desc, SPAN_FIELD);
   gcc_assert (TREE_TYPE (field) == gfc_array_index_type);
   return field;
 }
@@ -513,7 +521,7 @@ conv_type_set (stmtblock_t *block, tree desc, tree value)
 tree
 get_dimensions (tree desc)
 {
-  tree field = get_field (desc, DIMENSION_FIELD);
+  tree field = get_component (desc, DIMENSION_FIELD);
   gcc_assert (TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE
              && TREE_CODE (TREE_TYPE (TREE_TYPE (field))) == RECORD_TYPE);
   return field;
@@ -573,11 +581,18 @@ conv_dimension_set (stmtblock_t *block, tree desc, tree 
dim, tree value)
 }
 
 
+tree
+get_token_field (tree desc)
+{
+  gcc_assert (flag_coarray == GFC_FCOARRAY_LIB);
+  return get_field (desc, CAF_TOKEN_FIELD);
+}
+
 tree
 get_token (tree desc)
 {
   gcc_assert (flag_coarray == GFC_FCOARRAY_LIB);
-  tree field = get_field (desc, CAF_TOKEN_FIELD);
+  tree field = get_component (desc, CAF_TOKEN_FIELD);
   /* Should be a restricted pointer - except in the finalization wrapper.  */
   gcc_assert (TREE_TYPE (field) == prvoid_type_node
              || TREE_TYPE (field) == pvoid_type_node);
@@ -861,6 +876,12 @@ gfc_conv_descriptor_token_get (tree desc)
   return gfc_descriptor::conv_token_get (desc);
 }
 
+tree
+gfc_conv_descriptor_token_field (tree desc)
+{
+  return gfc_descriptor::get_token_field (desc);
+}
+
 void
 gfc_conv_descriptor_token_set (stmtblock_t *block, tree desc, tree value)
 {
diff --git a/gcc/fortran/trans-array.h b/gcc/fortran/trans-array.h
index a704d9384cd1..836a177da014 100644
--- a/gcc/fortran/trans-array.h
+++ b/gcc/fortran/trans-array.h
@@ -205,6 +205,7 @@ tree gfc_conv_descriptor_ubound_get (tree, tree);
 tree gfc_conv_descriptor_extent_get (tree, tree);
 tree gfc_conv_descriptor_sm_get (tree, tree);
 tree gfc_conv_descriptor_token_get (tree);
+tree gfc_conv_descriptor_token_field (tree);
 
 void gfc_conv_descriptor_data_set (stmtblock_t *, tree, tree);
 void gfc_conv_descriptor_offset_set (stmtblock_t *, tree, tree);
diff --git a/gcc/fortran/trans-intrinsic.cc b/gcc/fortran/trans-intrinsic.cc
index 019191a54b67..4e280b9b7208 100644
--- a/gcc/fortran/trans-intrinsic.cc
+++ b/gcc/fortran/trans-intrinsic.cc
@@ -1318,9 +1318,7 @@ conv_expr_ref_to_caf_ref (stmtblock_t *block, gfc_expr 
*expr)
              tree arr_desc_token_offset;
              /* Get the token field from the descriptor.  */
              tree descriptor = ref->u.c.component->backend_decl;
-             tree desc_token = gfc_conv_descriptor_token_get (descriptor);
-             gcc_assert (TREE_CODE (desc_token) == COMPONENT_REF);
-             arr_desc_token_offset = TREE_OPERAND (desc_token, 1);
+             arr_desc_token_offset = gfc_conv_descriptor_token_field 
(descriptor);
              arr_desc_token_offset
                  = compute_component_offset (arr_desc_token_offset,
                                              TREE_TYPE (tmp));

Reply via email to