When we have a subprogram that has been determined to contain errors, we do not perform name resolution on its execution part. In this case, if the subprogram contains a NULLIFY statement, the parser::Name of a pointer object in a NULLIFY statement will not have had name resolution performed on it. Thus, its symbol will not have been set. Later, however, we do semantic checking on the NULLIFY statement. The code that did this assumed that the parser::Name of the pointer object was non-null. I fixed this by just removing the null pointer check for the "symbol" member of the "parser::Name" of the pointer object when doing semantic checking for NULLIFY statements. I also added a test that will make the compiler crash without this change. Differential Revision: https://reviews.llvm.org/D98184
50 lines
1.1 KiB
Fortran
50 lines
1.1 KiB
Fortran
! RUN: %S/test_errors.sh %s %t %f18
|
|
! 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
|
|
module 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
|