https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106692

Tobias Burnus <burnus at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |burnus at gcc dot gnu.org

--- Comment #4 from Tobias Burnus <burnus at gcc dot gnu.org> ---
Pre-remark: As Cray pointers are outside the spec, it is a bit difficult to
know what to expect. – I do note that it compiles fine with ifort +
optimizations turned on, whatever that means. This and that it did work with
GCC and this PR exists implies that there is real-world code out there which
now fails - but worked before. (Independent whether the code is valid or not.)

 * * *

Regarding the code, given that
      subroutine shape_cray(zz1)
        ! REAL :: zz1  ! (implicitly typed)
is a normal variable, I would expect from normal Fortran rules that it is
definable – and, hence, can not be a NULL pointer.

If I wanted to pass a Cray pointer, I would make the dummy argument a Cray
pointer – namely, passing a pointer - and not the pointee:

      subroutine shape_cray(ptrzz1)  ! << changed to ptrzz1 from zz1 for better
naming
        pointer(ptrzz1 , zz1)  ! << added line - ptrzz1 is now a cray pointer
        pointer(ptrzz, zz)

Accordingly, the callee then has to use:
          call shape_cray(ptrzz1)  ! pass the pointer
instead of
          call shape_cray(zz1)

This also passes by reference (-fdump-tree-original):
  void shape_cray (integer(kind=8) & restrict ptrzz1)
but that's the pointer (which must be present) but not the pointee.

When passing the Cray pointer, everything seems to work fine and looks well
defined.

 * * *

In my humble opinion, passing a Cray pointer and using a Cray-pointer dummy
argument is the proper Cray-pointer way.

Regarding OPTIONAL - that would work as well, but means the the interface has
to be availble at the callee side, i.e. either an 'interface' block or
shape_cray needs to be contained in a module or in the caller - or it and the
caller need to be contained in the same subprogram (like contained in the
'program').
All of that is fine, but wasn't available in Fortran 77 - the time Cray
pointers were invented.

Reply via email to