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

commit be9181018e6b8c3b751665d4213448cfaecf5d09
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Thu Jun 19 17:22:05 2025 +0200

    Ajout non_lvalue getters.

Diff:
---
 gcc/fortran/trans-descriptor.cc | 38 +++++++++++++++++++++++---------------
 1 file changed, 23 insertions(+), 15 deletions(-)

diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc
index 30093a74ae58..3d14581e3958 100644
--- a/gcc/fortran/trans-descriptor.cc
+++ b/gcc/fortran/trans-descriptor.cc
@@ -176,6 +176,13 @@ gfc_get_descriptor_field (tree desc, unsigned field_idx)
                          desc, field, NULL_TREE);
 }
 
+
+static tree
+get_descriptor_data (tree desc)
+{
+  return gfc_get_descriptor_field (desc, DATA_FIELD);
+}
+
 /* This provides READ-ONLY access to the data field.  The field itself
    doesn't have the proper type.  */
 
@@ -183,11 +190,12 @@ tree
 gfc_conv_descriptor_data_get (tree desc)
 {
   tree type = TREE_TYPE (desc);
-  if (TREE_CODE (type) == REFERENCE_TYPE)
-    gcc_unreachable ();
+  gcc_assert (TREE_CODE (type) != REFERENCE_TYPE);
 
-  tree field = gfc_get_descriptor_field (desc, DATA_FIELD);
-  return fold_convert (GFC_TYPE_ARRAY_DATAPTR_TYPE (type), field);
+  tree field = get_descriptor_data (desc);
+  tree target_type = GFC_TYPE_ARRAY_DATAPTR_TYPE (TREE_TYPE (desc));
+  tree t = fold_convert (target_type, field);
+  return non_lvalue_loc (input_location, t);
 }
 
 /* This provides WRITE access to the data field.
@@ -227,7 +235,7 @@ gfc_conv_descriptor_offset (tree desc)
 tree
 gfc_conv_descriptor_offset_get (tree desc)
 {
-  return gfc_conv_descriptor_offset (desc);
+  return non_lvalue_loc (input_location, gfc_conv_descriptor_offset (desc));
 }
 
 void
@@ -258,7 +266,7 @@ gfc_conv_descriptor_span (tree desc)
 tree
 gfc_conv_descriptor_span_get (tree desc)
 {
-  return gfc_conv_descriptor_span (desc);
+  return non_lvalue_loc (input_location, gfc_conv_descriptor_span (desc));
 }
 
 void
@@ -391,7 +399,7 @@ gfc_conv_descriptor_subfield (tree desc, tree dim, unsigned 
field_idx)
 }
 
 static tree
-gfc_conv_descriptor_stride (tree desc, tree dim)
+get_descriptor_stride (tree desc, tree dim)
 {
   tree field = gfc_conv_descriptor_subfield (desc, dim, STRIDE_SUBFIELD);
   gcc_assert (TREE_TYPE (field) == gfc_array_index_type);
@@ -412,19 +420,19 @@ gfc_conv_descriptor_stride_get (tree desc, tree dim)
          || GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_POINTER_CONT))
     return gfc_index_one_node;
 
-  return gfc_conv_descriptor_stride (desc, dim);
+  return non_lvalue_loc (input_location, get_descriptor_stride (desc, dim));
 }
 
 void
 gfc_conv_descriptor_stride_set (stmtblock_t *block, tree desc,
                                tree dim, tree value)
 {
-  tree t = gfc_conv_descriptor_stride (desc, dim);
+  tree t = get_descriptor_stride (desc, dim);
   gfc_add_modify (block, t, fold_convert (TREE_TYPE (t), value));
 }
 
 static tree
-gfc_conv_descriptor_lbound (tree desc, tree dim)
+get_descriptor_lbound (tree desc, tree dim)
 {
   tree field = gfc_conv_descriptor_subfield (desc, dim, LBOUND_SUBFIELD);
   gcc_assert (TREE_TYPE (field) == gfc_array_index_type);
@@ -434,19 +442,19 @@ gfc_conv_descriptor_lbound (tree desc, tree dim)
 tree
 gfc_conv_descriptor_lbound_get (tree desc, tree dim)
 {
-  return gfc_conv_descriptor_lbound (desc, dim);
+  return non_lvalue_loc (input_location, get_descriptor_lbound (desc, dim));
 }
 
 void
 gfc_conv_descriptor_lbound_set (stmtblock_t *block, tree desc,
                                tree dim, tree value)
 {
-  tree t = gfc_conv_descriptor_lbound (desc, dim);
+  tree t = get_descriptor_lbound (desc, dim);
   gfc_add_modify (block, t, fold_convert (TREE_TYPE (t), value));
 }
 
 static tree
-gfc_conv_descriptor_ubound (tree desc, tree dim)
+get_descriptor_ubound (tree desc, tree dim)
 {
   tree field = gfc_conv_descriptor_subfield (desc, dim, UBOUND_SUBFIELD);
   gcc_assert (TREE_TYPE (field) == gfc_array_index_type);
@@ -456,14 +464,14 @@ gfc_conv_descriptor_ubound (tree desc, tree dim)
 tree
 gfc_conv_descriptor_ubound_get (tree desc, tree dim)
 {
-  return gfc_conv_descriptor_ubound (desc, dim);
+  return non_lvalue_loc (input_location, get_descriptor_ubound (desc, dim));
 }
 
 void
 gfc_conv_descriptor_ubound_set (stmtblock_t *block, tree desc,
                                tree dim, tree value)
 {
-  tree t = gfc_conv_descriptor_ubound (desc, dim);
+  tree t = get_descriptor_ubound (desc, dim);
   gfc_add_modify (block, t, fold_convert (TREE_TYPE (t), value));
 }

Reply via email to