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
50 lines
1.1 KiB
Fortran
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
|