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

kargls at comcast dot net changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |kargls at comcast dot net

--- Comment #3 from kargls at comcast dot net ---
Additional data point.  This gives the correct answer.

program main
   integer j
   complex, allocatable :: x(:)
   x= [(cmplx(j,-j), j=1, 4)]
   call fubar(x%re, x%im)
   contains
      subroutine fubar(u, v)
         real, intent(in) :: u(:), v(:)
         print *, 'phi%re:', u
         print *, 'phi%im:', v
      end subroutine
end program

% gfcx -o z a.f90 && ./z
  phi%re:   1.00000000       2.00000000       3.00000000       4.0000000
  phi%im:  -1.00000000      -2.00000000      -3.00000000      -4.00000000    

So, resolving the ultimate allocatable complex component seems to be involved.

Also note, that the above generates the expected temporary arrays.

% gfcx -o z -Warray-temporaries a.f90
a.f90:21:14:

   21 |    call fubar(x%re, x%im)
      |              1
Warning: Creating array temporary at (1) [-Warray-temporaries]
a.f90:21:20:

   21 |    call fubar(x%re, x%im)
      |                    1
Warning: Creating array temporary at (1) [-Warray-temporaries]

Neil's original code does not generate temporaries and appears
to be passing the address of x(1)%phi%re.

Reply via email to