1! RUN: %python %S/test_errors.py %s %flang_fc1
2! Tests valid and invalid NULL initializers
3
4module m1
5  implicit none
6  !ERROR: No explicit type declared for 'null'
7  private :: null
8end module
9
10module m2
11  implicit none
12  private :: null
13  integer, pointer :: p => null()
14end module
15
16module m3
17  private :: null
18  integer, pointer :: p => null()
19end module
20
21module m4
22  intrinsic :: null
23  integer, pointer :: p => null()
24end module
25
26module m5
27  external :: null
28  !ERROR: Pointer initializer must be intrinsic NULL()
29  integer, pointer :: p => null()
30end module
31
32module m6
33  !ERROR: Symbol 'null' cannot have both INTRINSIC and EXTERNAL attributes
34  integer, pointer :: p => null()
35  external :: null
36end module
37
38module m7
39  interface
40    function null() result(p)
41      integer, pointer :: p
42    end function
43  end interface
44  !ERROR: Pointer initializer must be intrinsic NULL()
45  integer, pointer :: p => null()
46end module
47
48module m8
49  integer, pointer :: p => null()
50  interface
51    !ERROR: 'null' is already declared in this scoping unit
52    function null() result(p)
53      integer, pointer :: p
54    end function
55  end interface
56end module
57
58module m9a
59  intrinsic :: null
60 contains
61  function foo()
62    integer, pointer :: foo
63    foo => null()
64  end function
65end module
66module m9b
67  use m9a, renamed => null, null => foo
68  integer, pointer :: p => renamed()
69  !ERROR: Pointer initializer must be intrinsic NULL()
70  integer, pointer :: q => null()
71  integer, pointer :: d1, d2
72  data d1/renamed()/
73  !ERROR: An initial data target must be a designator with constant subscripts
74  data d2/null()/
75end module
76
77subroutine m10
78  real, pointer :: x, y
79  !ERROR: 'null' must be an array or structure constructor if used with non-empty parentheses as a DATA statement constant
80  data x/null(y)/
81end
82
83subroutine m11
84  type :: null
85    integer :: mold
86  end type
87  type(null) :: obj(2)
88  integer, parameter :: j = 0
89  data obj/null(mold=j), null(j)/ ! both fine
90end subroutine
91
92subroutine m12
93  integer, parameter :: j = 1
94  integer, target, save :: null(1)
95  integer, pointer :: p
96  data p/null(j)/ ! ok
97end subroutine
98
99subroutine s13
100  integer, external, pointer :: p1 => null()
101  procedure(), pointer :: p2 => null()
102end subroutine
103