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

Jerry DeLisle <[email protected]> Mon, 3 Aug 2026 17:14:10 -0700
Newsgroups gmane.comp.gcc.patches,gmane.comp.gcc.fortran
Message-ID <[email protected]>
PING please

On 7/30/26 10:21 AM, Jerry D wrote:
> 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.
> 
> 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.
> 
>              PR fortran/53800
> 
>      gcc/fortran/ChangeLog:
> 
>              * trans-array.cc (need_span): New function.
>              (gfc_get_array_span): Read the span from the saved 
> descriptor of a
>              span-array dummy, but not for a sub-array reached through a
>              component.
>              (gfc_conv_scalarized_array_ref): Use need_span.
>              (gfc_conv_array_ref): Likewise.
>              (build_array_ref): Default DECL to DESC for a span-array decl.
>              * trans-decl.cc (gfc_build_dummy_array_decl): Mark a TARGET
>              assumed-shape derived-type dummy as needing runtime span
>              addressing, unless it is repacked.
>              * trans-expr.cc (class_actual_aliases_type_dummy): New 
> function.
>              (gfc_class_array_data_assign): Also copy the span field.
>              (gfc_conv_procedure_call): Use 
> class_actual_aliases_type_dummy to
>              skip copy-in/copy-out for both the class array reference 
> and the
>              class array function actual argument.
>              * trans.cc (get_array_span): Read the span from the dummy's 
> saved
>              descriptor for span-array decls.
>              * trans.h (struct lang_decl): Add span_array bitfield.
>              (GFC_DECL_SPAN_ARRAY_P): New macro.
>              (GFC_DECL_GET_SPAN_ARRAY_P): New macro.
> 
>      gcc/testsuite/ChangeLog:
> 
>              * gfortran.dg/class_to_type_5.f90: New test.
>              * gfortran.dg/class_to_type_6.f90: New test.
>