1 ! RUN: %python %S/test_errors.py %s %flang_fc1 -pedantic
2 ! Test 15.5.2.5 constraints and restrictions for POINTER & ALLOCATABLE
3 ! arguments when both sides of the call have the same attributes.
15 type(t
), pointer :: mp(:), mpmat(:,:)
16 type(t
), allocatable
:: ma(:), mamat(:,:)
17 class(t
), pointer :: pp(:)
18 class(t
), allocatable
:: pa(:)
19 class(t2
), pointer :: pp2(:)
20 class(t2
), allocatable
:: pa2(:)
21 class(*), pointer :: up(:)
22 class(*), allocatable
:: ua(:)
23 !ERROR: An assumed (*) type parameter may be used only for a (non-statement function) dummy argument, associate name, character named constant, or external function result
24 type(pdt(*)), pointer :: amp(:)
25 !ERROR: An assumed (*) type parameter may be used only for a (non-statement function) dummy argument, associate name, character named constant, or external function result
26 type(pdt(*)), allocatable
:: ama(:)
27 type(pdt(:)), pointer :: dmp(:)
28 type(pdt(:)), allocatable
:: dma(:)
29 type(pdt(1)), pointer :: nmp(:)
30 type(pdt(1)), allocatable
:: nma(:)
35 type(t
), pointer :: x(:)
38 type(t
), allocatable
:: x(:)
41 class(t
), pointer :: x(:)
44 class(t
), allocatable
:: x(:)
47 class(*), pointer :: x(:)
50 class(*), allocatable
:: x(:)
53 type(pdt(*)), pointer :: x(:)
56 type(pdt(*)), allocatable
:: x(:)
59 type(pdt(:)), pointer :: x(:)
62 type(pdt(:)), allocatable
:: x(:)
65 type(pdt(1)), pointer :: x(:)
68 type(pdt(1)), allocatable
:: x(:)
76 !PORTABILITY: If a POINTER or ALLOCATABLE actual argument is polymorphic, the corresponding dummy argument should also be so
78 !PORTABILITY: If a POINTER or ALLOCATABLE actual argument is polymorphic, the corresponding dummy argument should also be so
80 !ERROR: If a POINTER or ALLOCATABLE dummy or actual argument is polymorphic, both must be so
82 !ERROR: If a POINTER or ALLOCATABLE dummy or actual argument is polymorphic, both must be so
84 !ERROR: If a POINTER or ALLOCATABLE dummy or actual argument is unlimited polymorphic, both must be so
86 !ERROR: If a POINTER or ALLOCATABLE dummy or actual argument is unlimited polymorphic, both must be so
88 !ERROR: Actual argument type 'CLASS(*)' is not compatible with dummy argument type 'CLASS(t)'
89 !ERROR: Pointer type must be unlimited polymorphic or non-extensible derived type when target is unlimited polymorphic
91 !ERROR: Actual argument type 'CLASS(*)' is not compatible with dummy argument type 'CLASS(t)'
93 !ERROR: POINTER or ALLOCATABLE dummy and actual arguments must have the same declared type and kind
95 !ERROR: POINTER or ALLOCATABLE dummy and actual arguments must have the same declared type and kind
97 !ERROR: Rank of dummy argument is 1, but actual argument has rank 2
98 !ERROR: Pointer has rank 1 but target has rank 2
100 !ERROR: Rank of dummy argument is 1, but actual argument has rank 2
108 !ERROR: Dummy and actual arguments must defer the same type parameters when POINTER or ALLOCATABLE
110 !ERROR: Dummy and actual arguments must defer the same type parameters when POINTER or ALLOCATABLE
112 !ERROR: Dummy and actual arguments must defer the same type parameters when POINTER or ALLOCATABLE
114 !ERROR: Dummy and actual arguments must defer the same type parameters when POINTER or ALLOCATABLE
116 !ERROR: Dummy and actual arguments must defer the same type parameters when POINTER or ALLOCATABLE
118 !ERROR: Dummy and actual arguments must defer the same type parameters when POINTER or ALLOCATABLE
126 character(len
=10), allocatable
:: t1
, t2
, t3
, t4
127 character(len
=:), allocatable
:: t5
, t6
, t7
, t8(:)
129 character(len
=10), pointer :: p1
130 character(len
=:), pointer :: p2
132 integer, allocatable
:: x(:)
137 character(len
=:), allocatable
, intent(in
) :: a
141 character(len
=10), allocatable
, intent(in
) :: a
145 character(len
=:), pointer, intent(in
) :: p
149 character(len
=10), pointer, intent(in
) :: p
153 integer, allocatable
, intent(in
) :: b(:)
156 function return_deferred_length_ptr()
157 character(len
=:), pointer :: return_deferred_length_ptr
158 return_deferred_length_ptr
=> p2
161 function return_explicit_length_ptr(n
)
163 character(len
=n
), pointer :: return_explicit_length_ptr
164 return_explicit_length_ptr
=> p2(1:n
)
169 !ERROR: Dummy and actual arguments must defer the same type parameters when POINTER or ALLOCATABLE
174 !ERROR: Dummy and actual arguments must defer the same type parameters when POINTER or ALLOCATABLE
179 call smp(return_deferred_length_ptr()) ! ok
181 !ERROR: Dummy and actual arguments must defer the same type parameters when POINTER or ALLOCATABLE
182 call smp2(return_deferred_length_ptr())
184 !ERROR: Dummy and actual arguments must defer the same type parameters when POINTER or ALLOCATABLE
185 call smp(return_explicit_length_ptr(10))
187 call smp2(return_explicit_length_ptr(10)) ! ok
189 !ERROR: ALLOCATABLE dummy argument 'a=' must be associated with an ALLOCATABLE actual argument
192 !ERROR: 't3' is not a callable procedure
195 !ERROR: ALLOCATABLE dummy argument 'a=' must be associated with an ALLOCATABLE actual argument
200 !ERROR: Dummy and actual arguments must defer the same type parameters when POINTER or ALLOCATABLE
205 !ERROR: Dummy and actual arguments must defer the same type parameters when POINTER or ALLOCATABLE
208 !ERROR: ALLOCATABLE dummy argument 'a=' must be associated with an ALLOCATABLE actual argument
211 !ERROR: 't6' is not a callable procedure
214 !ERROR: ALLOCATABLE dummy argument 'a=' must be associated with an ALLOCATABLE actual argument
217 !ERROR: ALLOCATABLE dummy argument 'a=' must be associated with an ALLOCATABLE actual argument
220 !ERROR: ALLOCATABLE dummy argument 'b=' must be associated with an ALLOCATABLE actual argument
223 !ERROR: Rank of dummy argument is 1, but actual argument has rank 0
224 !ERROR: ALLOCATABLE dummy argument 'b=' must be associated with an ALLOCATABLE actual argument
227 !ERROR: ALLOCATABLE dummy argument 'b=' must be associated with an ALLOCATABLE actual argument
243 type(t(:)), allocatable
:: p(:)
247 type(t(10)), allocatable
:: p(:)
249 !ERROR: Dummy and actual arguments must defer the same type parameters when POINTER or ALLOCATABLE