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

commit b9c0a4bc6636fcee98412d3fd9cff0a89baed767
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Wed Aug 6 14:26:53 2025 +0200

    Refactoring get_type_field

Diff:
---
 gcc/fortran/trans-descriptor.cc | 31 +++++++++++--------------------
 1 file changed, 11 insertions(+), 20 deletions(-)

diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc
index b54910a5e93c..6888ff508d67 100644
--- a/gcc/fortran/trans-descriptor.cc
+++ b/gcc/fortran/trans-descriptor.cc
@@ -174,10 +174,12 @@ gfc_get_cfi_dim_sm (tree desc, tree idx)
 
 
 static tree
-get_type_field (tree type, unsigned field_idx)
+get_type_field (tree type, unsigned field_idx, tree field_type = NULL_TREE)
 {
   tree field = gfc_advance_chain (TYPE_FIELDS (type), field_idx);
-  gcc_assert (field != NULL_TREE);
+  gcc_assert (field != NULL_TREE
+             && (field_type == NULL_TREE
+                 || TREE_TYPE (field) == field_type));
 
   return field;
 }
@@ -186,22 +188,19 @@ get_type_field (tree type, unsigned field_idx)
 static tree
 get_ref_comp (tree ref, unsigned field_idx, tree type = NULL_TREE)
 {
-  tree field = get_type_field (TREE_TYPE (ref), field_idx);
-  gcc_assert (field != NULL_TREE
-             && (type == NULL_TREE
-                 || TREE_TYPE (field) == type));
-
+  tree field = get_type_field (TREE_TYPE (ref), field_idx, type);
   return fold_build3_loc (input_location, COMPONENT_REF, TREE_TYPE (field),
                          ref, field, NULL_TREE);
 }
 
 
 static tree
-gfc_get_descriptor_field (tree desc, unsigned field_idx)
+gfc_get_descriptor_field (tree desc, unsigned field_idx,
+                         tree type = NULL_TREE)
 {
   gcc_assert (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (desc)));
 
-  return get_ref_comp (desc, field_idx);
+  return get_ref_comp (desc, field_idx, type);
 }
 
 
@@ -245,9 +244,7 @@ gfc_conv_descriptor_data_set (stmtblock_t *block, tree 
desc, tree value)
 static tree
 get_descriptor_offset (tree desc)
 {
-  tree field = gfc_get_descriptor_field (desc, OFFSET_FIELD);
-  gcc_assert (TREE_TYPE (field) == gfc_array_index_type);
-  return field;
+  return gfc_get_descriptor_field (desc, OFFSET_FIELD, gfc_array_index_type);
 }
 
 tree
@@ -267,9 +264,7 @@ gfc_conv_descriptor_offset_set (stmtblock_t *block, tree 
desc, tree value)
 static tree
 get_descriptor_dtype (tree desc)
 {
-  tree field = gfc_get_descriptor_field (desc, DTYPE_FIELD);
-  gcc_assert (TREE_TYPE (field) == get_dtype_type_node ());
-  return field;
+  return gfc_get_descriptor_field (desc, DTYPE_FIELD, get_dtype_type_node ());
 }
 
 tree
@@ -291,9 +286,7 @@ gfc_conv_descriptor_dtype_set (stmtblock_t *block, tree 
desc, tree value)
 static tree
 gfc_conv_descriptor_span (tree desc)
 {
-  tree field = gfc_get_descriptor_field (desc, SPAN_FIELD);
-  gcc_assert (TREE_TYPE (field) == gfc_array_index_type);
-  return field;
+  return gfc_get_descriptor_field (desc, SPAN_FIELD, gfc_array_index_type);
 }
 
 tree
@@ -423,10 +416,8 @@ gfc_conv_descriptor_type_set (stmtblock_t *block, tree 
desc, int value)
   gcc_assert (GFC_DESCRIPTOR_TYPE_P (type));
 
   tree dtype = get_type_field (type, DTYPE_FIELD);
-  gcc_assert (dtype != NULL_TREE);
 
   tree field = get_type_field (TREE_TYPE (dtype), GFC_DTYPE_TYPE);
-  gcc_assert (field != NULL_TREE);
 
   tree type_value = build_int_cst (TREE_TYPE (field), value);
   gfc_conv_descriptor_type_set (block, desc, type_value);

Reply via email to