! RUN: %python %S/test_errors.py %s %flang_fc1
! Tests valid and invalid NULL initializers
module m1
implicit none
!ERROR: No explicit type declared for 'null'
private :: null
end module
module m2
implicit none
private :: null
integer, pointer :: p => null()
end module
module m3
private :: null
integer, pointer :: p => null()
end module
module m4
intrinsic :: null
integer, pointer :: p => null()
end module
module m5
external :: null
!ERROR: Pointer initializer must be intrinsic NULL()
integer, pointer :: p => null()
end module
module m6
!ERROR: Symbol 'null' cannot have both INTRINSIC and EXTERNAL attributes
integer, pointer :: p => null()
external :: null
end module
module m7
interface
!WARNING: The external interface 'null' is not compatible with an earlier definition (incompatible procedure attributes: ImplicitInterface)
function null() result(p)
integer, pointer :: p
end function
end interface
!ERROR: Pointer initializer must be intrinsic NULL()
integer, pointer :: p => null()
end module
module m8
integer, pointer :: p => null()
interface
!ERROR: 'null' is already declared in this scoping unit
function null() result(p)
integer, pointer :: p
end function
end interface
end module
module m9a
intrinsic :: null
contains
function foo()
integer, pointer :: foo
foo => null()
end function
end module
module m9b
use m9a, renamed => null, null => foo
integer, pointer :: p => renamed()
!ERROR: Pointer initializer must be intrinsic NULL()
integer, pointer :: q => null()
integer, pointer :: d1, d2
data d1/renamed()/
!ERROR: An initial data target must be a designator with constant subscripts
data d2/null()/
end module
subroutine m10
real, pointer :: x, y
!ERROR: 'null' must be an array or structure constructor if used with non-empty parentheses as a DATA statement constant
data x/null(y)/
end
subroutine m11
type :: null
integer :: mold
end type
type(null) :: obj(2)
integer, parameter :: j = 0
data obj/null(mold=j), null(j)/ ! both fine
end subroutine
subroutine m12
integer, parameter :: j = 1
integer, target, save :: null(1)
integer, pointer :: p
data p/null(j)/ ! ok
end subroutine
subroutine s13
integer, external, pointer :: p1 => null()
procedure(), pointer :: p2 => null()
end subroutine