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

Jerry DeLisle <[email protected]>
Newsgroups gmane.comp.gcc.patches,gmane.comp.gcc.fortran
Message-ID <[email protected]>
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
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.