In
CALL FOO
PRINT *, ABS(FOO)
we currently resolve the first FOO to a global external subprogram, but
then the second FOO is treated as an implicitly typed local variable.
This happens because the name FOO is not present in the local scope.
Fix by adding FOO to the local scope using a place-holding
HostAssocDetails symbol whose existence prevents the creation of another
FOO in the local scope. The symbol stored in the parser::Name parse tree
nodes or used in typed expressions will all continue to point to the
global external subprogram.
Resolves llvm-test-suite/Fortran/gfortran/regression/pr71859.f90.
59 lines
2.2 KiB
Fortran
59 lines
2.2 KiB
Fortran
! RUN: not %flang -fsyntax-only -pedantic 2>&1 %s | FileCheck %s
|
|
module m
|
|
contains
|
|
subroutine subr1(f)
|
|
character(5) f
|
|
print *, f('abcde')
|
|
end subroutine
|
|
subroutine subr2(f)
|
|
character(*) f
|
|
print *, f('abcde')
|
|
end subroutine
|
|
character(5) function explicitLength(x)
|
|
character(5), intent(in) :: x
|
|
explicitLength = x
|
|
end function
|
|
character(6) function badExplicitLength(x)
|
|
character(5), intent(in) :: x
|
|
badExplicitLength = x
|
|
end function
|
|
real function notChar(x)
|
|
character(*), intent(in) :: x
|
|
notChar = 0
|
|
end function
|
|
end module
|
|
|
|
character(*) function assumedLength(x)
|
|
character(*), intent(in) :: x
|
|
assumedLength = x
|
|
end function
|
|
|
|
subroutine subr3(f)
|
|
character(5) f
|
|
print *, f('abcde')
|
|
end subroutine
|
|
|
|
program main
|
|
use m
|
|
external assumedlength
|
|
character(5) :: assumedlength
|
|
call subr1(explicitLength)
|
|
!CHECK: error: Actual argument function associated with procedure dummy argument 'f=' is not compatible: function results have distinct types: CHARACTER(KIND=1,LEN=5_8) vs CHARACTER(KIND=1,LEN=6_8)
|
|
call subr1(badExplicitLength)
|
|
call subr1(assumedLength)
|
|
!CHECK: error: Actual argument function associated with procedure dummy argument 'f=' is not compatible: function results have distinct types: CHARACTER(KIND=1,LEN=5_8) vs REAL(4)
|
|
call subr1(notChar)
|
|
call subr2(explicitLength)
|
|
call subr2(assumedLength)
|
|
!CHECK: error: Actual argument function associated with procedure dummy argument 'f=' is not compatible: function results have distinct types: CHARACTER(KIND=1,LEN=*) vs REAL(4)
|
|
call subr2(notChar)
|
|
call subr3(explicitLength)
|
|
!CHECK: warning: If the procedure's interface were explicit, this reference would be in error
|
|
!CHECK: because: Actual argument function associated with procedure dummy argument 'f=' is not compatible: function results have distinct types: CHARACTER(KIND=1,LEN=5_8) vs CHARACTER(KIND=1,LEN=6_8)
|
|
call subr3(badExplicitLength)
|
|
call subr3(assumedLength)
|
|
!CHECK: warning: If the procedure's interface were explicit, this reference would be in error
|
|
!CHECK: because: Actual argument function associated with procedure dummy argument 'f=' is not compatible: function results have distinct types: CHARACTER(KIND=1,LEN=5_8) vs REAL(4)
|
|
call subr3(notChar)
|
|
end program
|