Peter Klausler dc0d56febb [flang] Warn about local names that are the same as their enclosing program unit
Modules, submodules, main programs, and BLOCK DATA subprograms have names
that cannot be used within their scope, so we allow those names to be
used for other entities in the scope.  This might not be entirely
conformant with the language standard, so warn about it.

Differential Revision: https://reviews.llvm.org/D139146
2022-12-03 17:47:35 -08:00

86 lines
2.5 KiB
Fortran

! RUN: %python %S/test_errors.py %s %flang_fc1
module m
abstract interface
subroutine foo
end subroutine
subroutine foo2
end subroutine
end interface
procedure() :: a
procedure(integer) :: b
procedure(foo) :: c
procedure(bar) :: d
!ERROR: 'missing' must be an abstract interface or a procedure with an explicit interface
procedure(missing) :: e
!ERROR: 'b' must be an abstract interface or a procedure with an explicit interface
procedure(b) :: f
procedure(c) :: g
external :: h
!ERROR: 'h' must be an abstract interface or a procedure with an explicit interface
procedure(h) :: i
procedure(forward) :: j
!ERROR: 'bad1' must be an abstract interface or a procedure with an explicit interface
procedure(bad1) :: k1
!ERROR: 'bad2' must be an abstract interface or a procedure with an explicit interface
procedure(bad2) :: k2
!ERROR: 'bad3' must be an abstract interface or a procedure with an explicit interface
procedure(bad3) :: k3
abstract interface
subroutine forward
end subroutine
end interface
real :: bad1(1)
real :: bad2
type :: bad3
end type
!PORTABILITY: Name 'm' declared in a module should not have the same name as the module
type :: m
end type m
!ERROR: EXTERNAL attribute was already specified on 'a'
!ERROR: EXTERNAL attribute was already specified on 'b'
!ERROR: EXTERNAL attribute was already specified on 'c'
!ERROR: EXTERNAL attribute was already specified on 'd'
external :: a, b, c, d
!ERROR: EXTERNAL attribute not allowed on 'm'
external :: m
!ERROR: EXTERNAL attribute not allowed on 'foo'
external :: foo
!ERROR: EXTERNAL attribute not allowed on 'bar'
external :: bar
!ERROR: PARAMETER attribute not allowed on 'm'
parameter(m=2)
!ERROR: PARAMETER attribute not allowed on 'foo'
parameter(foo=2)
!ERROR: PARAMETER attribute not allowed on 'bar'
parameter(bar=2)
type, abstract :: t1
integer :: i
contains
!ERROR: 'proc' must be an abstract interface or a procedure with an explicit interface
!ERROR: Procedure component 'p1' must have NOPASS attribute or explicit interface
procedure(proc), deferred :: p1
end type t1
abstract interface
function f()
end function
end interface
contains
subroutine bar
end subroutine
subroutine test
!ERROR: Abstract procedure interface 'foo2' may not be referenced
call foo2()
!ERROR: Abstract procedure interface 'f' may not be referenced
x = f()
end subroutine
end module