[patch, fortran] Warn about suspicious assignment to contiguous pointers

Thomas Koenig tkoenig@netcologne.de
Tue Aug 29 20:41:00 GMT 2017


Hi Janus,

>>>>> and in that
>>>>> case I would argue that, beyond being "not useful", it's even illegal,
>>>>> so why not throw a hard error, if we can infer at compile-time that
>>>>> the target is non-contiguous?
>>>>
>>>> Problem is, we cannot infer this from the tests done.
>>>> We would also have to add a test if the array is empty
>>>> or that it contains only a single element, and that (I think)
>>>> is a) impossible in the general case, and b) not worth the bother.
>>>
>>> I'm not sure I understand which cases you're worried about here. Maybe
>>> you can give an example?
>>
>>    real, dimension(5,5), target :: a
>>    real, dimension(:,:), pointer, contiguous :: ap
>>    ap => a(4::2,4::2)
>>
>> points to a single element, which is (by definition) contiguous.
> 
> yes, I see that your current patch mishandles this case.

It does _not_ mishandle that case.  It issues a warning for a
very dubious practice. The warning can be turned off at will.

Issuing a hard error whould be mishandling this case.


>But why
> should it be impossible to detect that there is only a single element?
> If the triplet and the array bounds are constant, it is certainly
> possible.

Too much work into supporting a corner case of a dubious practice.  I'm
not going to do it.

>> There are also a few other checks that I missed, for
>> example
>>
>>    subroutine foo(a)
>>    real, dimension(:), target, intent(inout) :: a
>>    real, dimension(:), contiguous :: ap
>>    ap => a
>>
>> I will also address this in a future version of the patch.
> 
> How do you want to do that?

Warn in all cases.

Because the code writer can not how if the array passed to the
subroutine is contigous (use case of a library), it is not
possible for him to know if the user will do this correctly or
not.  The correct way to write this subroutine then is

subroutine foo(a)
   real, dimension(:), target, intent(inout), contiguous :: a
   real, dimension(:), contiguous :: ap
   ap => a

when gfortran will someday complain if the dummy argument
is associated with a non-contiguous entity.



More information about the Fortran mailing list