xref: /llvm-project/flang/test/Semantics/null-init.f90 (revision 982614fa47e87ba6760907588f5021e1b6d5911c)
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    !WARNING: The external interface 'null' is not compatible with an earlier definition (incompatible procedure attributes: ImplicitInterface)
41    function null() result(p)
42      integer, pointer :: p
43    end function
44  end interface
45  !ERROR: Pointer initializer must be intrinsic NULL()
46  integer, pointer :: p => null()
47end module
48
49module m8
50  integer, pointer :: p => null()
51  interface
52    !ERROR: 'null' is already declared in this scoping unit
53    function null() result(p)
54      integer, pointer :: p
55    end function
56  end interface
57end module
58
59module m9a
60  intrinsic :: null
61 contains
62  function foo()
63    integer, pointer :: foo
64    foo => null()
65  end function
66end module
67module m9b
68  use m9a, renamed => null, null => foo
69  integer, pointer :: p => renamed()
70  !ERROR: Pointer initializer must be intrinsic NULL()
71  integer, pointer :: q => null()
72  integer, pointer :: d1, d2
73  data d1/renamed()/
74  !ERROR: An initial data target must be a designator with constant subscripts
75  data d2/null()/
76end module
77
78subroutine m10
79  real, pointer :: x, y
80  !ERROR: 'null' must be an array or structure constructor if used with non-empty parentheses as a DATA statement constant
81  data x/null(y)/
82end
83
84subroutine m11
85  type :: null
86    integer :: mold
87  end type
88  type(null) :: obj(2)
89  integer, parameter :: j = 0
90  data obj/null(mold=j), null(j)/ ! both fine
91end subroutine
92
93subroutine m12
94  integer, parameter :: j = 1
95  integer, target, save :: null(1)
96  integer, pointer :: p
97  data p/null(j)/ ! ok
98end subroutine
99
100subroutine s13
101  integer, external, pointer :: p1 => null()
102  procedure(), pointer :: p2 => null()
103end subroutine
104