Peter Klausler 396865576f [flang] Accommodate module subprograms defined in the same module
The symbol table, name resolution, and semantic checks for module
subprograms -- esp. for MODULE FUNCTION and MODULE SUBROUTINE, but
also MODULE PROCEDURE -- essentially assumed that the subprogram
would be defined in a submodule of the (sub)module containing its
interface.  However, it is conforming to instead declare a module
subprogram in the *same* (sub)module as its interface, and we need
to handle that case.

Since this case involves two symbols in the same scope with the same
name, the symbol table details for subprograms have been extended
with a pointer to the original module interface, rather than relying
on searching in scopes.

Differential Revision: https://reviews.llvm.org/D120839
2022-03-02 13:07:16 -08:00

50 lines
1.1 KiB
Fortran

! RUN: %python %S/test_errors.py %s %flang_fc1
! Check for semantic errors in NULLIFY statements
INTEGER, PARAMETER :: maxvalue=1024
Type dt
Integer :: l = 3
End Type
Type t
Type(dt) :: p
End Type
Type(t),Allocatable :: x(:)
Integer :: pi
Procedure(Real) :: prp
Allocate(x(3))
!ERROR: component in NULLIFY statement must have the POINTER attribute
Nullify(x(2)%p)
!ERROR: name in NULLIFY statement must have the POINTER attribute
Nullify(pi)
!ERROR: name in NULLIFY statement must have the POINTER attribute
Nullify(prp)
!ERROR: name in NULLIFY statement must be a variable or procedure pointer name
Nullify(maxvalue)
End Program
! Make sure that the compiler doesn't crash when NULLIFY is used in a context
! that has reported errors
module badNullify
interface
function ptrFun()
integer, pointer :: ptrFun
end function
end interface
contains
!ERROR: 'ptrfun' was not declared a separate module procedure
module function ptrFun()
integer, pointer :: ptrFun
real :: realVar
nullify(ptrFun)
nullify(realVar)
end function
end module