Jean Perier f2f6190960 [flang] Always create HostAssocDetails for host object symbols with UseDetails
https://reviews.llvm.org/D105464 did not correctly cover the case
where the symbol from the host procedure is use associated. Outside
of the mis-parsed ArrayRef case, flang was also creating a symbol with
HostAssociated details inside the internal procedure (pointing to the
use associated symbol in the host). That is what lowering expects.
This patch ensures the same logic is applied in the mis-parsed array-ref name
resolution (and the pointer target name resolution).

Differential Revision: https://reviews.llvm.org/D107759
2021-08-10 12:38:19 +02:00

102 lines
2.2 KiB
Fortran

! RUN: %python %S/test_symbols.py %s %flang_fc1
! Test host association in internal subroutine of main program.
!DEF: /main MainProgram
program main
!DEF: /main/x ObjectEntity INTEGER(4)
integer x
!DEF: /main/s (Subroutine) Subprogram
call s
contains
!REF: /main/s
subroutine s
!DEF: /main/s/y (Implicit) ObjectEntity REAL(4)
!DEF: /main/s/x HostAssoc INTEGER(4)
y = x
contains
!DEF: /main/s/s2 (Subroutine) Subprogram
subroutine s2
!DEF: /main/s/s2/z (Implicit) ObjectEntity REAL(4)
!DEF: /main/s/s2/x HostAssoc INTEGER(4)
z = x
end subroutine
end subroutine
end program
!DEF: /s (Subroutine) Subprogram
subroutine s
!DEF: /s/x ObjectEntity REAL(4)
real x(100, 100)
!DEF: /s/s1 (Subroutine) Subprogram
call s1
contains
!REF: /s/s1
subroutine s1
!DEF: /s/s1/x HostAssoc REAL(4)
print *, x(10, 10)
end subroutine
end subroutine
!DEF: /sb (Subroutine) Subprogram
subroutine sb
!DEF: /sb/x TARGET ObjectEntity REAL(4)
real, target :: x
!DEF: /sb/s1 (Subroutine) Subprogram
call s1
contains
!REF: /sb/s1
subroutine s1
!DEF: /sb/s1/p POINTER ObjectEntity REAL(4)
real, pointer :: p
!REF: /sb/s1/p
!DEF: /sb/s1/x TARGET HostAssoc REAL(4)
p => x
end subroutine
end subroutine
! Test host associated symbols are also created for symbols that are use
! associated in the host.
!DEF: /m1 Module
module m1
!DEF: /m1/x PUBLIC ObjectEntity REAL(4)
real x(100,100)
!DEF: /m1/x_target PUBLIC, TARGET ObjectEntity REAL(4)
real, target :: x_target
end module
!DEF: /s_use (Subroutine) Subprogram
subroutine s_use
!REF: /m1
use :: m1
!DEF: /s_use/x Use REAL(4)
print *, x
!DEF: /s_use/s1 (Subroutine) Subprogram
call s1
contains
!REF: /s_use/s1
subroutine s1
!DEF: /s_use/s1/x HostAssoc REAL(4)
print *, x(10,10)
end subroutine
end subroutine
!DEF: /sb_use (Subroutine) Subprogram
subroutine sb_use
!REF: /m1
use :: m1
!DEF: /sb_use/x_target TARGET Use REAL(4)
print *, x_target
!DEF: /sb_use/s1 (Subroutine) Subprogram
call s1
contains
!REF: /sb_use/s1
subroutine s1
!DEF: /sb_use/s1/p POINTER ObjectEntity REAL(4)
real, pointer :: p
!REF: /sb_use/s1/p
!DEF: /sb_use/s1/x_target TARGET HostAssoc REAL(4)
p => x_target
end subroutine
end subroutine