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

commit 2cc86ddeeb9abfcc1c5a1e1642de28b3499c226a
Author: Mikael Morin <[email protected]>
Date:   Wed Oct 14 14:31:06 2026 +0200

    Extraction decl dereference

Diff:
---
 gcc/fortran/trans-array.cc | 27 ++++++++++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)

diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index 2a187925e941..9f2e4e551418 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -677,7 +677,32 @@ gfc_get_array_span (tree desc, gfc_expr *expr)
   gfc_symbol *sym = (expr && expr->expr_type == EXPR_VARIABLE) ?
                    expr->symtree->n.sym : NULL;
 
-  if (tree span = GFC_DECL_GET_SPAN (desc))
+  tree decl = desc;
+  while (decl && !DECL_P (decl))
+    {
+      if (TREE_CODE (decl) == ADDR_EXPR
+         || INDIRECT_REF_P (decl)
+         || CONVERT_EXPR_P (decl))
+       decl = TREE_OPERAND (decl, 0);
+      else if (TREE_CODE (decl) == COMPONENT_REF)
+       {
+         tree base = TREE_OPERAND (decl, 0);
+         tree field_decl = TREE_OPERAND (decl, 1);
+         if ((GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (base))
+              && !strcmp (IDENTIFIER_POINTER (DECL_NAME (field_decl)), "data"))
+             || (GFC_CLASS_TYPE_P (TREE_TYPE (base))
+                 && !strcmp (IDENTIFIER_POINTER (DECL_NAME (field_decl)), 
+                             "_data")))
+           decl = field_decl;
+         else
+           decl = NULL_TREE;
+       }
+      else
+       decl = NULL_TREE;
+    }
+
+  tree span;
+  if (decl && span = GFC_DECL_GET_SPAN (decl))
     /* A span addressed dummy loaded its span on entry.  */
     tmp = span;
   else if (is_span_addressed_array (desc)

Reply via email to