1! RUN: %S/test_errors.sh %s %t %flang_fc1
2! REQUIRES: shell
3! Test for checking select type constraints,
4module m1
5  use ISO_C_BINDING
6  type shape
7    integer :: color
8    logical :: filled
9    integer :: x
10    integer :: y
11  end type shape
12
13  type, extends(shape) :: rectangle
14    integer :: length
15    integer :: width
16  end type rectangle
17
18  type, extends(rectangle) :: square
19  end type square
20
21  type, extends(square) :: extsquare
22  end type
23
24  type :: unrelated
25    logical :: some_logical
26  end type
27
28  type withSequence
29    SEQUENCE
30    integer :: x
31  end type
32
33  type, BIND(C) :: withBind
34    INTEGER(c_int) ::int_in_c
35  end type
36
37  TYPE(shape), TARGET :: shape_obj
38  TYPE(rectangle), TARGET :: rect_obj
39  TYPE(square), TARGET :: squr_obj
40  !define polymorphic objects
41  class(*), pointer :: unlim_polymorphic
42  class(shape), pointer :: shape_lim_polymorphic
43end
44module m
45  type :: t(n)
46    integer, len :: n
47  end type
48contains
49  subroutine CheckC1160( a )
50    class(*), intent(in) :: a
51    select type ( a )
52      !ERROR: The type specification statement must have LEN type parameter as assumed
53      type is ( character(len=10) ) !<-- assumed length-type
54      ! OK
55      type is ( character(len=*) )
56      !ERROR: The type specification statement must have LEN type parameter as assumed
57      type is ( t(n=10) )
58      ! OK
59      type is ( t(n=*) )   !<-- assumed length-type
60      !ERROR: Derived type 'character' not found
61      class is ( character(len=10) ) !<-- assumed length-type
62    end select
63  end subroutine
64
65  subroutine s()
66    type derived(param)
67      integer, len :: param
68      class(*), allocatable :: x
69    end type
70    TYPE(derived(10)) :: a
71    select type (ax => a%x)
72      class is (derived(param=*))
73        print *, "hello"
74    end select
75  end subroutine s
76end module
77
78subroutine CheckC1157
79  use m1
80  integer, parameter :: const_var=10
81  !ERROR: Selector is not a named variable: 'associate-name =>' is required
82  select type(10)
83  end select
84  !ERROR: Selector is not a named variable: 'associate-name =>' is required
85  select type(const_var)
86  end select
87  !ERROR: Selector is not a named variable: 'associate-name =>' is required
88  select type (4.999)
89  end select
90  !ERROR: Selector is not a named variable: 'associate-name =>' is required
91  select type (shape_obj%x)
92  end select
93end subroutine
94
95!CheckPloymorphicSelectorType
96subroutine CheckC1159a
97  integer :: int_variable
98  real :: real_variable
99  complex :: complex_var = cmplx(3.0, 4.0)
100  logical :: log_variable
101  character (len=10) :: char_variable = "OM"
102  !ERROR: Selector 'int_variable' in SELECT TYPE statement must be polymorphic
103  select type (int_variable)
104  end select
105  !ERROR: Selector 'real_variable' in SELECT TYPE statement must be polymorphic
106  select type (real_variable)
107  end select
108  !ERROR: Selector 'complex_var' in SELECT TYPE statement must be polymorphic
109  select type(complex_var)
110  end select
111  !ERROR: Selector 'logical_variable' in SELECT TYPE statement must be polymorphic
112  select type(logical_variable)
113  end select
114  !ERROR: Selector 'char_variable' in SELECT TYPE statement must be polymorphic
115  select type(char_variable)
116  end select
117end
118
119subroutine CheckC1159b
120  integer :: x
121  !ERROR: Selector 'x' in SELECT TYPE statement must be polymorphic
122  select type (a => x)
123  !ERROR: If selector is not unlimited polymorphic, an intrinsic type specification must not be specified in the type guard statement
124  type is (integer)
125    print *,'integer ',a
126  end select
127end
128
129subroutine CheckC1159c
130  !ERROR: Selector 'x' in SELECT TYPE statement must be polymorphic
131  select type (a => x)
132  !ERROR: If selector is not unlimited polymorphic, an intrinsic type specification must not be specified in the type guard statement
133  type is (integer)
134    print *,'integer ',a
135  end select
136end
137
138subroutine s(arg)
139  class(*) :: arg
140    select type (arg)
141        type is (integer)
142    end select
143end
144
145subroutine CheckC1161
146  use m1
147  shape_lim_polymorphic => rect_obj
148  select type(shape_lim_polymorphic)
149    !ERROR: The type specification statement must not specify a type with a SEQUENCE attribute or a BIND attribute
150    type is (withSequence)
151    !ERROR: The type specification statement must not specify a type with a SEQUENCE attribute or a BIND attribute
152    type is (withBind)
153  end select
154end
155
156subroutine CheckC1162
157  use m1
158  class(rectangle), pointer :: rectangle_polymorphic
159  !not unlimited polymorphic objects
160  select type (rectangle_polymorphic)
161    !ERROR: Type specification 'shape' must be an extension of TYPE 'rectangle'
162    type is (shape)
163    !ERROR: Type specification 'unrelated' must be an extension of TYPE 'rectangle'
164    type is (unrelated)
165    !all are ok
166    type is (square)
167    type is (extsquare)
168    !Handle same types
169    type is (rectangle)
170    !ERROR: If selector is not unlimited polymorphic, an intrinsic type specification must not be specified in the type guard statement
171    type is(integer)
172    !ERROR: If selector is not unlimited polymorphic, an intrinsic type specification must not be specified in the type guard statement
173    type is(real)
174    !ERROR: If selector is not unlimited polymorphic, an intrinsic type specification must not be specified in the type guard statement
175    type is(logical)
176    !ERROR: If selector is not unlimited polymorphic, an intrinsic type specification must not be specified in the type guard statement
177    type is(character(len=*))
178    !ERROR: If selector is not unlimited polymorphic, an intrinsic type specification must not be specified in the type guard statement
179    type is(complex)
180  end select
181
182  !Unlimited polymorphic objects are allowed.
183  unlim_polymorphic => rect_obj
184  select type (unlim_polymorphic)
185    type is (shape)
186    type is (unrelated)
187  end select
188end
189
190subroutine CheckC1163
191  use m1
192  !assign dynamically
193  shape_lim_polymorphic => rect_obj
194  unlim_polymorphic => shape_obj
195  select type (shape_lim_polymorphic)
196    type is (shape)
197    !ERROR: Type specification 'shape' conflicts with previous type specification
198    type is (shape)
199    class is (square)
200    !ERROR: Type specification 'square' conflicts with previous type specification
201    class is (square)
202  end select
203  select type (unlim_polymorphic)
204    type is (INTEGER(4))
205    type is (shape)
206    !ERROR: Type specification 'INTEGER(4)' conflicts with previous type specification
207    type is (INTEGER(4))
208  end select
209end
210
211subroutine CheckC1164
212  use m1
213  shape_lim_polymorphic => rect_obj
214  unlim_polymorphic => shape_obj
215  select type (shape_lim_polymorphic)
216    CLASS DEFAULT
217    !ERROR: Type specification 'DEFAULT' conflicts with previous type specification
218    CLASS DEFAULT
219    TYPE IS (shape)
220    TYPE IS (rectangle)
221    !ERROR: Type specification 'DEFAULT' conflicts with previous type specification
222    CLASS DEFAULT
223  end select
224
225  !Saving computation if some error in guard by not computing RepeatingCases
226  select type (shape_lim_polymorphic)
227    CLASS DEFAULT
228    CLASS DEFAULT
229    !ERROR: The type specification statement must not specify a type with a SEQUENCE attribute or a BIND attribute
230    TYPE IS(withSequence)
231  end select
232end subroutine
233
234subroutine WorkingPolymorphism
235  use m1
236  !assign dynamically
237  shape_lim_polymorphic => rect_obj
238  unlim_polymorphic => shape_obj
239  select type (shape_lim_polymorphic)
240    type is  (shape)
241      print *, "hello shape"
242    type is  (rectangle)
243      print *, "hello rect"
244    type is  (square)
245      print *, "hello square"
246    CLASS DEFAULT
247      print *, "default"
248  end select
249  print *, "unlim polymorphism"
250  select type (unlim_polymorphic)
251    type is  (shape)
252      print *, "hello shape"
253    type is  (rectangle)
254      print *, "hello rect"
255    type is  (square)
256      print *, "hello square"
257    CLASS DEFAULT
258      print *, "default"
259  end select
260end
261