mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-17 14:26:49 +00:00

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
102 lines
2.2 KiB
Fortran
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
|