https://gcc.gnu.org/g:2f1b1f398a45d72d35c2275cf94b656a8d761b7d

commit 2f1b1f398a45d72d35c2275cf94b656a8d761b7d
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Sun Aug 10 17:03:28 2025 +0200

    Introduction enums pour les champs des structures
    
    Correction régression

Diff:
---
 gcc/fortran/trans-array.h       |   5 +-
 gcc/fortran/trans-descriptor.cc | 199 ++++++++++++++++++++++++++++++++--------
 gcc/fortran/trans-types.cc      | 141 +++-------------------------
 gcc/fortran/trans.h             |   6 --
 4 files changed, 178 insertions(+), 173 deletions(-)

diff --git a/gcc/fortran/trans-array.h b/gcc/fortran/trans-array.h
index 66e8ed332b03..c1886eb1faaf 100644
--- a/gcc/fortran/trans-array.h
+++ b/gcc/fortran/trans-array.h
@@ -169,8 +169,9 @@ tree gfc_trans_array_bounds (tree, gfc_symbol *, tree *, 
stmtblock_t *);
 void gfc_trans_array_cobounds (tree, stmtblock_t *, const gfc_symbol *);
 
 /* Build expressions for accessing components of an array descriptor.  */
-void gfc_get_descriptor_offsets_for_info (const_tree, tree *, tree *, tree *, 
tree *,
-                                         tree *, tree *, tree *, tree *);
+void gfc_get_descriptor_offsets_for_info (const_tree, tree *, tree *, tree *,
+                                         tree *, tree *, tree *, tree *,
+                                         tree *, tree *);
 
 /* Shift lower bound of descriptor, updating ubound and offset.  */
 void gfc_conv_shift_descriptor_lbound (stmtblock_t*, tree, int, tree);
diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc
index 422e8544397d..7030f0a8d6e9 100644
--- a/gcc/fortran/trans-descriptor.cc
+++ b/gcc/fortran/trans-descriptor.cc
@@ -162,16 +162,31 @@ gfc_get_cfi_dim_sm (tree desc, tree idx)
 
    Don't forget to #undef these!  */
 
-#define DATA_FIELD 0
-#define OFFSET_FIELD 1
-#define DTYPE_FIELD 2
-#define SPAN_FIELD 3
-#define DIMENSION_FIELD 4
-#define CAF_TOKEN_FIELD 5
+enum descriptor_field
+{
+  DATA_FIELD = 0,
+  OFFSET_FIELD,
+  DTYPE_FIELD,
+  SPAN_FIELD,
+  DIMENSION_FIELD,
+  CAF_TOKEN_FIELD,
+};
 
-#define STRIDE_SUBFIELD 0
-#define LBOUND_SUBFIELD 1
-#define UBOUND_SUBFIELD 2
+enum dim_subfield
+{
+  STRIDE_SUBFIELD = 0,
+  LBOUND_SUBFIELD,
+  UBOUND_SUBFIELD,
+};
+
+enum dtype_subfield
+{
+  GFC_DTYPE_ELEM_LEN = 0,
+  GFC_DTYPE_VERSION,
+  GFC_DTYPE_RANK,
+  GFC_DTYPE_TYPE,
+  GFC_DTYPE_ATTRIBUTE
+};
 
 
 static tree
@@ -195,14 +210,15 @@ get_ref_comp (tree ref, unsigned field_idx, tree type = 
NULL_TREE)
 
 
 static tree
-get_descr_comp (tree desc, unsigned field_idx, tree type = NULL_TREE)
+get_descr_comp (tree desc, descriptor_field field, tree type = NULL_TREE)
 {
   gcc_assert (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (desc)));
 
-  return get_ref_comp (desc, field_idx, type);
+  return get_ref_comp (desc, field, type);
 }
 
-void
+
+static void
 set_value (stmtblock_t *block, tree ref, tree value)
 {
   location_t loc = input_location;
@@ -305,10 +321,10 @@ gfc_conv_descriptor_span_set (stmtblock_t *block, tree 
desc, tree value)
 
 
 static tree
-get_dtype_comp (tree desc, unsigned field_idx, tree type = NULL_TREE)
+get_dtype_comp (tree desc, dtype_subfield field, tree type = NULL_TREE)
 {
   tree dtype_ref = get_descriptor_dtype (desc);
-  return get_ref_comp (dtype_ref, field_idx, type);
+  return get_ref_comp (dtype_ref, field, type);
 }
 
 
@@ -495,11 +511,11 @@ gfc_conv_descriptor_token_set (stmtblock_t *block, tree 
desc, tree value)
 
 
 static tree
-get_descr_dim_comp (tree desc, tree dim, unsigned field_idx,
+get_descr_dim_comp (tree desc, tree dim, dim_subfield field,
                    tree type = NULL_TREE)
 {
   tree tmp = get_descriptor_dimension (desc, dim);
-  return get_ref_comp (tmp, field_idx, type);
+  return get_ref_comp (tmp, field, type);
 }
 
 static tree
@@ -575,6 +591,124 @@ gfc_conv_descriptor_ubound_set (stmtblock_t *block, tree 
desc,
  * Array descriptor higher level routines.                                     
*
  
******************************************************************************/
 
+/* Return the DTYPE for an array.  This describes the type and type parameters
+   of the array.  */
+/* TODO: Only call this when the value is actually used, and make all the
+   unknown cases abort.  */
+
+tree
+gfc_get_dtype_rank_type (int rank, tree etype)
+{
+  tree ptype;
+  tree size;
+  int n;
+  tree tmp;
+  tree dtype;
+  tree field;
+  vec<constructor_elt, va_gc> *v = NULL;
+
+  ptype = etype;
+  while (TREE_CODE (etype) == POINTER_TYPE
+        || TREE_CODE (etype) == ARRAY_TYPE)
+    {
+      ptype = etype;
+      etype = TREE_TYPE (etype);
+    }
+
+  gcc_assert (etype);
+
+  switch (TREE_CODE (etype))
+    {
+    case INTEGER_TYPE:
+      if (TREE_CODE (ptype) == ARRAY_TYPE
+         && TYPE_STRING_FLAG (ptype))
+       n = BT_CHARACTER;
+      else
+       {
+         if (TYPE_UNSIGNED (etype))
+           n = BT_UNSIGNED;
+         else
+           n = BT_INTEGER;
+       }
+      break;
+
+    case BOOLEAN_TYPE:
+      n = BT_LOGICAL;
+      break;
+
+    case REAL_TYPE:
+      n = BT_REAL;
+      break;
+
+    case COMPLEX_TYPE:
+      n = BT_COMPLEX;
+      break;
+
+    case RECORD_TYPE:
+      if (GFC_CLASS_TYPE_P (etype))
+       n = BT_CLASS;
+      else
+       n = BT_DERIVED;
+      break;
+
+    case FUNCTION_TYPE:
+    case VOID_TYPE:
+      n = BT_VOID;
+      break;
+
+    default:
+      /* TODO: Don't do dtype for temporary descriptorless arrays.  */
+      /* We can encounter strange array types for temporary arrays.  */
+      gcc_unreachable ();
+    }
+
+  switch (n)
+    {
+    case BT_CHARACTER:
+      gcc_assert (TREE_CODE (ptype) == ARRAY_TYPE);
+      size = gfc_get_character_len_in_bytes (ptype);
+      break;
+    case BT_VOID:
+      gcc_assert (TREE_CODE (ptype) == POINTER_TYPE);
+      size = size_in_bytes (ptype);
+      break;
+    default:
+      size = size_in_bytes (etype);
+      break;
+    }
+
+  tree dtype_type_node = get_dtype_type_node ();
+
+  gcc_assert (size);
+
+  STRIP_NOPS (size);
+  size = fold_convert (size_type_node, size);
+  tmp = get_dtype_type_node ();
+  field = gfc_advance_chain (TYPE_FIELDS (tmp),
+                            GFC_DTYPE_ELEM_LEN);
+  CONSTRUCTOR_APPEND_ELT (v, field,
+                         fold_convert (TREE_TYPE (field), size));
+  field = gfc_advance_chain (TYPE_FIELDS (dtype_type_node),
+                            GFC_DTYPE_VERSION);
+  CONSTRUCTOR_APPEND_ELT (v, field,
+                         build_zero_cst (TREE_TYPE (field)));
+
+  field = gfc_advance_chain (TYPE_FIELDS (dtype_type_node),
+                            GFC_DTYPE_RANK);
+  if (rank >= 0)
+    CONSTRUCTOR_APPEND_ELT (v, field,
+                           build_int_cst (TREE_TYPE (field), rank));
+
+  field = gfc_advance_chain (TYPE_FIELDS (dtype_type_node),
+                            GFC_DTYPE_TYPE);
+  CONSTRUCTOR_APPEND_ELT (v, field,
+                         build_int_cst (TREE_TYPE (field), n));
+
+  dtype = build_constructor (tmp, v);
+
+  return dtype;
+}
+
 /* Build a null array descriptor constructor.  */
 
 tree
@@ -600,22 +734,26 @@ gfc_build_null_descriptor (tree type)
 
 void
 gfc_get_descriptor_offsets_for_info (const_tree desc_type, tree *data_off,
-                                    tree *dtype_off, tree *span_off,
-                                    tree *dim_off, tree *dim_size,
-                                    tree *stride_suboff, tree *lower_suboff,
-                                    tree *upper_suboff)
+                                    tree *dtype_off, tree *rank_suboff,
+                                    tree *span_off, tree *dim_off,
+                                    tree *dim_size, tree *stride_suboff,
+                                    tree *lower_suboff, tree *upper_suboff)
 {
   tree field;
   tree type;
 
   type = TYPE_MAIN_VARIANT (desc_type);
-  field = gfc_advance_chain (TYPE_FIELDS (type), DATA_FIELD);
+  tree fields = TYPE_FIELDS (type);
+  field = gfc_advance_chain (fields, DATA_FIELD);
   *data_off = byte_position (field);
-  field = gfc_advance_chain (TYPE_FIELDS (type), DTYPE_FIELD);
+  field = gfc_advance_chain (fields, DTYPE_FIELD);
   *dtype_off = byte_position (field);
-  field = gfc_advance_chain (TYPE_FIELDS (type), SPAN_FIELD);
+  type = TREE_TYPE (field);
+  field = gfc_advance_chain (TYPE_FIELDS (type), GFC_DTYPE_RANK);
+  *rank_suboff = byte_position (field);
+  field = gfc_advance_chain (fields, SPAN_FIELD);
   *span_off = byte_position (field);
-  field = gfc_advance_chain (TYPE_FIELDS (type), DIMENSION_FIELD);
+  field = gfc_advance_chain (fields, DIMENSION_FIELD);
   *dim_off = byte_position (field);
   type = TREE_TYPE (TREE_TYPE (field));
   *dim_size = TYPE_SIZE_UNIT (type);
@@ -628,19 +766,6 @@ gfc_get_descriptor_offsets_for_info (const_tree desc_type, 
tree *data_off,
 }
 
 
-/* Cleanup those #defines.  */
-
-#undef DATA_FIELD
-#undef OFFSET_FIELD
-#undef DTYPE_FIELD
-#undef SPAN_FIELD
-#undef DIMENSION_FIELD
-#undef CAF_TOKEN_FIELD
-#undef STRIDE_SUBFIELD
-#undef LBOUND_SUBFIELD
-#undef UBOUND_SUBFIELD
-
-
 /* For an array descriptor, get the total number of elements.  This is just
    the product of the extents along from_dim to to_dim.  */
 
diff --git a/gcc/fortran/trans-types.cc b/gcc/fortran/trans-types.cc
index 1754d9821532..6b85fe3da67d 100644
--- a/gcc/fortran/trans-types.cc
+++ b/gcc/fortran/trans-types.cc
@@ -1689,123 +1689,6 @@ gfc_get_desc_dim_type (void)
 }
 
 
-/* Return the DTYPE for an array.  This describes the type and type parameters
-   of the array.  */
-/* TODO: Only call this when the value is actually used, and make all the
-   unknown cases abort.  */
-
-tree
-gfc_get_dtype_rank_type (int rank, tree etype)
-{
-  tree ptype;
-  tree size;
-  int n;
-  tree tmp;
-  tree dtype;
-  tree field;
-  vec<constructor_elt, va_gc> *v = NULL;
-
-  ptype = etype;
-  while (TREE_CODE (etype) == POINTER_TYPE
-        || TREE_CODE (etype) == ARRAY_TYPE)
-    {
-      ptype = etype;
-      etype = TREE_TYPE (etype);
-    }
-
-  gcc_assert (etype);
-
-  switch (TREE_CODE (etype))
-    {
-    case INTEGER_TYPE:
-      if (TREE_CODE (ptype) == ARRAY_TYPE
-         && TYPE_STRING_FLAG (ptype))
-       n = BT_CHARACTER;
-      else
-       {
-         if (TYPE_UNSIGNED (etype))
-           n = BT_UNSIGNED;
-         else
-           n = BT_INTEGER;
-       }
-      break;
-
-    case BOOLEAN_TYPE:
-      n = BT_LOGICAL;
-      break;
-
-    case REAL_TYPE:
-      n = BT_REAL;
-      break;
-
-    case COMPLEX_TYPE:
-      n = BT_COMPLEX;
-      break;
-
-    case RECORD_TYPE:
-      if (GFC_CLASS_TYPE_P (etype))
-       n = BT_CLASS;
-      else
-       n = BT_DERIVED;
-      break;
-
-    case FUNCTION_TYPE:
-    case VOID_TYPE:
-      n = BT_VOID;
-      break;
-
-    default:
-      /* TODO: Don't do dtype for temporary descriptorless arrays.  */
-      /* We can encounter strange array types for temporary arrays.  */
-      gcc_unreachable ();
-    }
-
-  switch (n)
-    {
-    case BT_CHARACTER:
-      gcc_assert (TREE_CODE (ptype) == ARRAY_TYPE);
-      size = gfc_get_character_len_in_bytes (ptype);
-      break;
-    case BT_VOID:
-      gcc_assert (TREE_CODE (ptype) == POINTER_TYPE);
-      size = size_in_bytes (ptype);
-      break;
-    default:
-      size = size_in_bytes (etype);
-      break;
-    }
-
-  gcc_assert (size);
-
-  STRIP_NOPS (size);
-  size = fold_convert (size_type_node, size);
-  tmp = get_dtype_type_node ();
-  field = gfc_advance_chain (TYPE_FIELDS (tmp),
-                            GFC_DTYPE_ELEM_LEN);
-  CONSTRUCTOR_APPEND_ELT (v, field,
-                         fold_convert (TREE_TYPE (field), size));
-  field = gfc_advance_chain (TYPE_FIELDS (dtype_type_node),
-                            GFC_DTYPE_VERSION);
-  CONSTRUCTOR_APPEND_ELT (v, field,
-                         build_zero_cst (TREE_TYPE (field)));
-
-  field = gfc_advance_chain (TYPE_FIELDS (dtype_type_node),
-                            GFC_DTYPE_RANK);
-  if (rank >= 0)
-    CONSTRUCTOR_APPEND_ELT (v, field,
-                           build_int_cst (TREE_TYPE (field), rank));
-
-  field = gfc_advance_chain (TYPE_FIELDS (dtype_type_node),
-                            GFC_DTYPE_TYPE);
-  CONSTRUCTOR_APPEND_ELT (v, field,
-                         build_int_cst (TREE_TYPE (field), n));
-
-  dtype = build_constructor (tmp, v);
-
-  return dtype;
-}
-
-
 tree
 gfc_get_dtype (tree type, int * rank)
 {
@@ -3712,9 +3595,9 @@ gfc_get_array_descr_info (const_tree type, struct 
array_descr_info *info)
   int rank, dim;
   bool indirect = false;
   tree etype, ptype, t, base_decl;
-  tree data_off, span_off, dim_off, dtype_off, dim_size, elem_size;
+  tree data_off, span_off, dim_off, dtype_off, rank_suboff, dim_size, 
elem_size;
   tree lower_suboff, upper_suboff, stride_suboff;
-  tree dtype, field, rank_off;
+  tree dtype;
 
   if (! GFC_DESCRIPTOR_TYPE_P (type))
     {
@@ -3767,9 +3650,10 @@ gfc_get_array_descr_info (const_tree type, struct 
array_descr_info *info)
   if (indirect)
     base_decl = build1 (INDIRECT_REF, ptype, base_decl);
 
-  gfc_get_descriptor_offsets_for_info (type, &data_off, &dtype_off, &span_off,
-                                      &dim_off, &dim_size, &stride_suboff,
-                                      &lower_suboff, &upper_suboff);
+  gfc_get_descriptor_offsets_for_info (type, &data_off, &dtype_off,
+                                      &rank_suboff, &span_off, &dim_off,
+                                      &dim_size, &stride_suboff, &lower_suboff,
+                                      &upper_suboff);
 
   t = fold_build_pointer_plus (base_decl, span_off);
   elem_size = build1 (INDIRECT_REF, gfc_array_index_type, t);
@@ -3801,12 +3685,13 @@ gfc_get_array_descr_info (const_tree type, struct 
array_descr_info *info)
       info->ndimensions = 1;
       t = fold_build_pointer_plus (base_decl, dtype_off);
       dtype = TYPE_MAIN_VARIANT (get_dtype_type_node ());
-      field = gfc_advance_chain (TYPE_FIELDS (dtype), GFC_DTYPE_RANK);
-      rank_off = byte_position (field);
-      t = fold_build_pointer_plus (t, rank_off);
-
-      t = build1 (NOP_EXPR, build_pointer_type (TREE_TYPE (field)), t);
-      t = build1 (INDIRECT_REF, TREE_TYPE (field), t);
+      t = fold_build_pointer_plus (t, rank_suboff);
+      tree field = TYPE_FIELDS (dtype);
+      while (field && byte_position (field) != rank_suboff)
+       field = DECL_CHAIN (field);
+      tree rank_type = TREE_TYPE (field);
+      t = build1 (NOP_EXPR, build_pointer_type (rank_type), t);
+      t = build1 (INDIRECT_REF, rank_type, t);
       info->rank = t;
       t = build0 (PLACEHOLDER_EXPR, TREE_TYPE (dim_off));
       t = size_binop (MULT_EXPR, t, dim_size);
diff --git a/gcc/fortran/trans.h b/gcc/fortran/trans.h
index 55541845a6d6..740c05015d66 100644
--- a/gcc/fortran/trans.h
+++ b/gcc/fortran/trans.h
@@ -1004,12 +1004,6 @@ extern GTY(()) tree gfor_fndecl_caf_random_init;
 /* gfortran-specific declaration information, the _CONT versions denote
    arrays with CONTIGUOUS attribute.  */
 
-#define GFC_DTYPE_ELEM_LEN 0
-#define GFC_DTYPE_VERSION 1
-#define GFC_DTYPE_RANK 2
-#define GFC_DTYPE_TYPE 3
-#define GFC_DTYPE_ATTRIBUTE 4
-
 enum gfc_array_kind
 {
   GFC_ARRAY_UNKNOWN,

Reply via email to