From: Mikael Morin <[email protected]>

Fortran-tested on aarch64-unknown-linux-gnu.  OK for mainline?

-- >8 --

The function span_addressed_array can return two values: either NULL_TREE or
its argument, and is used in bool conversion contexts everywhere except in
one single place.  Separate the predicate from the choice between NULL_TREE
and the argument in that single place and make the function return a
boolean.

gcc/fortran/ChangeLog:

        * trans-array.cc (span_addressed_array): Change return type to bool
        and rename to ...
        (is_span_addressed_array): ... this.
        (gfc_get_dataptr_offset): Separate the predicate from the choice
        between NULL_TREE and the input array.
        (gfc_get_array_span, gfc_conv_scalarized_array_ref,
        gfc_conv_array_ref): Update callers.
---
 gcc/fortran/trans-array.cc | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index 9f60a72a394..dd2ee7a53e9 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -497,11 +497,11 @@ is_pointer_array (tree expr)
    either a descriptor or the local decl of a descriptorless dummy array,
    which keeps the descriptor it was built from as the saved one.  */
 
-static tree
-span_addressed_array (tree expr)
+static bool
+is_span_addressed_array (tree expr)
 {
   if (is_pointer_array (expr))
-    return expr;
+    return true;
 
   if (VAR_P (expr)
       && GFC_DECL_PTR_ARRAY_P (expr)
@@ -509,9 +509,9 @@ span_addressed_array (tree expr)
       && GFC_ARRAY_TYPE_P (TREE_TYPE (expr))
       && DECL_LANG_SPECIFIC (expr)
       && GFC_DECL_SAVED_DESCRIPTOR (expr))
-    return expr;
+    return true;
 
-  return NULL_TREE;
+  return false;
 }
 
 
@@ -658,7 +658,7 @@ gfc_get_array_span (tree desc, gfc_expr *expr)
   if (tree span = GFC_DECL_GET_SPAN (desc))
     /* A span addressed dummy loaded its span on entry.  */
     tmp = span;
-  else if (span_addressed_array (desc)
+  else if (is_span_addressed_array (desc)
           || (get_CFI_desc (NULL, expr, &desc, NULL)
               && (POINTER_TYPE_P (TREE_TYPE (desc))
                   ? GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (TREE_TYPE (desc)))
@@ -4063,7 +4063,7 @@ gfc_conv_scalarized_array_ref (gfc_se * se, gfc_array_ref 
* ar,
   /* A pointer array component can be detected from its field decl. Fix
      the descriptor, mark the resulting variable decl and pass it to
      gfc_build_array_ref.  */
-  if (span_addressed_array (info->descriptor)
+  if (is_span_addressed_array (info->descriptor)
       || (expr && ((expr->ts.deferred && info->descriptor
                    && GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (info->descriptor)))
                   || (expr && gfc_expr_attr (expr).pdt_string))))
@@ -4317,7 +4317,7 @@ gfc_conv_array_ref (gfc_se * se, gfc_array_ref * ar, 
gfc_expr *expr,
   if (get_CFI_desc (sym, expr, &decl, ar))
     decl = build_fold_indirect_ref_loc (input_location, decl);
   if (!expr->ts.deferred && !sym->attr.codimension
-      && span_addressed_array (se->expr))
+      && is_span_addressed_array (se->expr))
     {
       if (INDIRECT_REF_P (se->expr))
        decl = TREE_OPERAND (se->expr, 0);
@@ -7736,7 +7736,8 @@ gfc_get_dataptr_offset (stmtblock_t *block, tree parm, 
tree desc, tree offset,
 
   /* An array whose elements are spaced by the span needs pointer arithmetic
      to reference an element.  */
-  tmp = build_array_ref (desc, offset, span_addressed_array (desc), NULL);
+  tree decl = is_span_addressed_array (desc) ? desc : NULL_TREE;
+  tmp = build_array_ref (desc, offset, decl, NULL);
 
   /* Offset the data pointer for pointer assignments from arrays with
      subreferences; e.g. my_integer => my_type(:)%integer_component.  */
-- 
2.53.0

Reply via email to