1! RUN: %S/test_errors.sh %s %t %f18
2! Pointer assignment constraints 10.2.2.2
3
4module m1
5  type :: t(k)
6    integer, kind :: k
7  end type
8  type t2
9    sequence
10    real :: t2Field
11  end type
12contains
13
14  ! C852
15  subroutine s0
16    !ERROR: 'p1' may not have both the POINTER and TARGET attributes
17    real, pointer :: p1, p3
18    allocatable :: p2
19    !ERROR: 'sin' may not have both the POINTER and INTRINSIC attributes
20    real, intrinsic, pointer :: sin
21    target :: p1
22    !ERROR: 'p2' may not have both the POINTER and ALLOCATABLE attributes
23    pointer :: p2
24    !ERROR: 'a' may not have the POINTER attribute because it is a coarray
25    real, pointer :: a(:)[*]
26  end
27
28  ! C1015
29  subroutine s1
30    real, target :: r
31    real(8), target :: r8
32    logical, target :: l
33    real, pointer :: p
34    p => r
35    !ERROR: Target type REAL(8) is not compatible with pointer type REAL(4)
36    p => r8
37    !ERROR: Target type LOGICAL(4) is not compatible with pointer type REAL(4)
38    p => l
39  end
40
41  ! C1019
42  subroutine s2
43    real, target :: r1(4), r2(4,4)
44    real, pointer :: p(:)
45    p => r1
46    !ERROR: Pointer has rank 1 but target has rank 2
47    p => r2
48  end
49
50  ! C1015
51  subroutine s3
52    type(t(1)), target :: x1
53    type(t(2)), target :: x2
54    type(t(1)), pointer :: p
55    p => x1
56    !ERROR: Target type t(k=2_4) is not compatible with pointer type t(k=1_4)
57    p => x2
58  end
59
60  ! C1016
61  subroutine s4(x)
62    class(*), target :: x
63    type(t(1)), pointer :: p1
64    type(t2), pointer :: p2
65    class(*), pointer :: p3
66    real, pointer :: p4
67    p2 => x  ! OK - not extensible
68    p3 => x  ! OK - unlimited polymorphic
69    !ERROR: Pointer type must be unlimited polymorphic or non-extensible derived type when target is unlimited polymorphic
70    p1 => x
71    !ERROR: Pointer type must be unlimited polymorphic or non-extensible derived type when target is unlimited polymorphic
72    p4 => x
73  end
74
75  ! C1020
76  subroutine s5
77    real, target :: x[*]
78    real, target, volatile :: y[*]
79    real, pointer :: p
80    real, pointer, volatile :: q
81    p => x
82    !ERROR: Pointer must be VOLATILE when target is a VOLATILE coarray
83    p => y
84    !ERROR: Pointer may not be VOLATILE when target is a non-VOLATILE coarray
85    q => x
86    q => y
87  end
88
89  ! C1021, C1023
90  subroutine s6
91    real, target :: x
92    real :: p
93    type :: tp
94      real, pointer :: a
95      real :: b
96    end type
97    type(tp) :: y
98    !ERROR: 'p' is not a pointer
99    p => x
100    y%a => x
101    !ERROR: 'b' is not a pointer
102    y%b => x
103  end
104
105  !C1025 (R1037) The expr shall be a designator that designates a
106  !variable with either the TARGET or POINTER attribute and is not
107  !an array section with a vector subscript, or it shall be a reference
108  !to a function that returns a data pointer.
109  subroutine s7
110    real, target :: a
111    real, pointer :: b
112    real, pointer :: c
113    real :: d
114    b => a
115    c => b
116    !ERROR: In assignment to object pointer 'b', the target 'd' is not an object with POINTER or TARGET attributes
117    b => d
118  end
119
120  ! C1025
121  subroutine s8
122    real :: a(10)
123    integer :: b(10)
124    real, pointer :: p(:)
125    !ERROR: An array section with a vector subscript may not be a pointer target
126    p => a(b)
127  end
128
129  ! C1025
130  subroutine s9
131    real, target :: x
132    real, pointer :: p
133    p => f1()
134    !ERROR: pointer 'p' is associated with the result of a reference to function 'f2' that is a not a pointer
135    p => f2()
136  contains
137    function f1()
138      real, pointer :: f1
139      f1 => x
140    end
141    function f2()
142      real :: f2
143      f2 = x
144    end
145  end
146
147  ! C1026 (R1037) A data-target shall not be a coindexed object.
148  subroutine s10
149    real, target :: a[*]
150    real, pointer :: b
151    !ERROR: A coindexed object may not be a pointer target
152    b => a[1]
153  end
154
155end
156
157module m2
158  type :: t1
159    real :: a
160  end type
161  type :: t2
162    type(t1) :: b
163    type(t1), pointer :: c
164    real :: d
165  end type
166end
167
168subroutine s2
169  use m2
170  real, pointer :: p
171  type(t2), target :: x
172  type(t2) :: y
173  !OK: x has TARGET attribute
174  p => x%b%a
175  !OK: c has POINTER attribute
176  p => y%c%a
177  !ERROR: In assignment to object pointer 'p', the target 'y%b%a' is not an object with POINTER or TARGET attributes
178  p => y%b%a
179  associate(z => x%b)
180    !OK: x has TARGET attribute
181    p => z%a
182  end associate
183  associate(z => y%c)
184    !OK: c has POINTER attribute
185    p => z%a
186  end associate
187  associate(z => y%b)
188    !ERROR: In assignment to object pointer 'p', the target 'z%a' is not an object with POINTER or TARGET attributes
189    p => z%a
190  end associate
191  associate(z => y%b%a)
192    !ERROR: In assignment to object pointer 'p', the target 'z' is not an object with POINTER or TARGET attributes
193    p => z
194  end associate
195end
196