mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-16 21:56:34 +00:00

An incorrect "Implicit declaration of function '...' has a different result type than in previous declaration" is being emitted for ENTRY names used recursively. The predicate used to check for recursive use only allowed for scopes of functions, not ENTRYs. Fixes llvm-test-suite/Fortran/gfortran/regression/whole_file_9.f90. Differential Revision: https://reviews.llvm.org/D157337
58 lines
1.6 KiB
Fortran
58 lines
1.6 KiB
Fortran
! RUN: %python %S/test_errors.py %s %flang_fc1 -Werror
|
|
! Catch discrepancies between a local interface and a global definition
|
|
|
|
subroutine global1(x)
|
|
integer, intent(in) :: x
|
|
end subroutine
|
|
|
|
subroutine global2(x) bind(c,name="xyz")
|
|
integer, intent(in) :: x
|
|
end subroutine
|
|
|
|
subroutine global3(x)
|
|
integer, intent(in) :: x
|
|
end subroutine
|
|
|
|
pure subroutine global4(x)
|
|
integer, intent(in) :: x
|
|
end subroutine
|
|
|
|
subroutine global5(x)
|
|
integer, intent(in) :: x
|
|
end subroutine
|
|
|
|
! Regression check: don't emit bogus "Implicit declaration of function 'global7' has a different result type than in previous declaration"
|
|
recursive function global6()
|
|
integer global6, z, n
|
|
entry global7(n) result(z)
|
|
if (n > 0) z = global7(n-1)
|
|
end function
|
|
|
|
program test
|
|
interface
|
|
!WARNING: The global subprogram 'global1' is not compatible with its local procedure declaration (incompatible dummy argument #1: incompatible dummy data object types: INTEGER(4) vs REAL(4))
|
|
subroutine global1(x)
|
|
real, intent(in) :: x
|
|
end subroutine
|
|
subroutine global2(x)
|
|
real, intent(in) :: x
|
|
end subroutine
|
|
subroutine global3(x) bind(c,name="abc")
|
|
real, intent(in) :: x
|
|
end subroutine
|
|
subroutine global4(x) ! not PURE, but that's ok
|
|
integer, intent(in) :: x
|
|
end subroutine
|
|
!WARNING: The global subprogram 'global5' is not compatible with its local procedure declaration (incompatible procedure attributes: Pure)
|
|
pure subroutine global5(x)
|
|
integer, intent(in) :: x
|
|
end subroutine
|
|
function global6()
|
|
integer global6
|
|
end function
|
|
function global7(n) result(z)
|
|
integer n, z
|
|
end function
|
|
end interface
|
|
end
|