On 8/5/26 3:25 AM, Mikael Morin wrote:
Hello,

Le 30/07/2026 à 19:21, Jerry D a écrit :
See the attached patch.

As stated in the PR we were missing the stride multiplier (ie span)

I will note as a useful tool: I had an initial patch for this but wanted to exercise it. I prompted Claude Pro Opus 5 to create numerous variations on the original test case provided by Tobias Burnus in the original report. The result was 25 to 30 variations which were helpful in identifying code paths I would not have otherwise found.  I am not using those test cases here.

From your comments below, obviously not all the test cases I needed were generated. lol


I flagged out this one to work on as it has been around a long time and we were giving wrong results without any idea it was happening.

I also wanted to mention that the fortran standardese is difficult to interpret but I think I got this right.

Regression tested on x86_64.

OK for mainline?

Comments appreciated.

Regards,

Jerry
---
     fortran: [PR53800] Wrong copy-in/out with CLASS array to assumed- shape 
TYPE

     A CLASS array actual passed to a plain assumed-shape derived-type dummy
     was always copied in and out, so pointers associated with the dummy went
     stale on return.  F2023 15.5.2.5 paragraph 9 requires the dummy to be
     associated with the actual's storage when it has the TARGET attribute and
     lacks CONTIGUOUS and VALUE; paragraph 8 leaves every other case free to
     use a copy.  Pass such a dummy by reference and address its elements with
     the descriptor's runtime span.


diff --git a/gcc/fortran/trans.h b/gcc/fortran/trans.h
index 7b28ecfce47..4063bbe70c4 100644
--- a/gcc/fortran/trans.h
+++ b/gcc/fortran/trans.h
@@ -1070,6 +1070,7 @@ struct GTY(()) lang_decl {
   unsigned int scalar_pointer : 1;
   unsigned int scalar_target : 1;
   unsigned int optional_arg : 1;
+  unsigned int span_array : 1;
 };


@@ -1087,12 +1088,16 @@ struct GTY(()) lang_decl {
   (DECL_LANG_SPECIFIC (node)->scalar_target)
 #define GFC_DECL_OPTIONAL_ARGUMENT(node) \
   (DECL_LANG_SPECIFIC (node)->optional_arg)
+#define GFC_DECL_SPAN_ARRAY_P(node) \
+  (DECL_LANG_SPECIFIC (node)->span_array)
 #define GFC_DECL_GET_SCALAR_ALLOCATABLE(node) \
   (DECL_LANG_SPECIFIC (node) ? GFC_DECL_SCALAR_ALLOCATABLE (node) : 0)
 #define GFC_DECL_GET_SCALAR_POINTER(node) \
   (DECL_LANG_SPECIFIC (node) ? GFC_DECL_SCALAR_POINTER (node) : 0)
 #define GFC_DECL_GET_SCALAR_TARGET(node) \
   (DECL_LANG_SPECIFIC (node) ? GFC_DECL_SCALAR_TARGET (node) : 0)
+#define GFC_DECL_GET_SPAN_ARRAY_P(node) \
+  (DECL_LANG_SPECIFIC (node) ? GFC_DECL_SPAN_ARRAY_P (node) : 0)
 #define GFC_DECL_PACKED_ARRAY(node) DECL_LANG_FLAG_0(node)
 #define GFC_DECL_PARTIAL_PACKED_ARRAY(node) DECL_LANG_FLAG_1(node)
 #define GFC_DECL_ASSIGN(node) DECL_LANG_FLAG_2(node)

I have the impression that the information provided by the new flag is somehow redundant with the existing flag GFC_DECL_PTR_ARRAY_P, and indeed, need_span is used everywhere side by side with is_pointer_array.
Could the flags be merged together, or maybe just reuse GFC_DECL_PTR_ARRAY_P?


I need to investigate this further. I was following the pattern of the defines just above.

--- snip ---

The check on type is probably unneeded.
Here is a (failing) variation of the testcase with integer type:


This is a good catch, your examples that fail are a key to this. I am working through a followup that includes these new cases, dropping the type check.

diff --git a/gcc/testsuite/gfortran.dg/class_to_type_5.f90 b/gcc/testsuite/ gfortran.dg/class_to_type_5.f90

--- snip --->
For the rest, the two get_array_span would need to be reworked to have the flags merged, but I think that's doable, and the rest looks good.

Agree, I will see how this ripples through.

Thanks for this review. Very helpful


Mikael


Reply via email to