2003-12-26 Guilhem Lavaux <guilhem@kaffe.org>
[official-gcc.git] / gcc / testsuite / ada / acats / tests / c5 / c57003a.ada
blob8ca95e52e6a57e5e610e8a64909df6f24872f6f0
1 -- C57003A.ADA
3 -- Grant of Unlimited Rights
4 --
5 -- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
6 -- F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained
7 -- unlimited rights in the software and documentation contained herein.
8 -- Unlimited rights are defined in DFAR 252.227-7013(a)(19). By making
9 -- this public release, the Government intends to confer upon all
10 -- recipients unlimited rights equal to those held by the Government.
11 -- These rights include rights to use, duplicate, release or disclose the
12 -- released technical data and computer software in whole or in part, in
13 -- any manner and for any purpose whatsoever, and to have or permit others
14 -- to do so.
16 -- DISCLAIMER
18 -- ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
19 -- DISCLOSED ARE AS IS. THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED
20 -- WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
21 -- SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE
22 -- OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
23 -- PARTICULAR PURPOSE OF SAID MATERIAL.
24 --*
25 -- CHECK THAT THE EXIT STATEMENT IS EVALUATED EACH TIME THROUGH A LOOP,
26 -- AND THAT IT IS EVALUATED CORRECTLY WHETHER POSITIONED AT THE
27 -- BEGINNING, MIDDLE, OR END OF THE LOOP.
31 -- EACH TEST IS A LOOP ON J WHERE THE EXIT CONDITIONS ARE TO EVALUATE
32 -- TO 'FALSE' A CERTAIN NUMBER OF TIMES UNTIL, AT THE APPROPRIATE
33 -- TIME, ONE OF THEM EVALUATES TO 'TRUE' AND CAUSES THE LOOP TO BE
34 -- EXITED.
37 -- THE TEST IS PERFORMED 30 TIMES FOR EACH OF THE FIRST TWO
38 -- DATA TYPES CONSIDERED ('INTEGER', USER-DEFINED ENUMERATION)
39 -- AND 26 TIMES FOR 'CHARACTER' (THUS 86 TIMES ALTOGETHER).
42 -- EACH DATA TYPE HAS ITS OWN SEPARATE SECTION OF CODE. ALL SECTIONS
43 -- FOLLOW THE SAME TESTING ALGORITHM (MUTATIS MUTANDIS). THE CALCU-
44 -- LATIONS WHICH KEEP TRACK OF THE FLOW OF CONTROL ARE ALL DONE IN
45 -- INTEGER ARITHMETIC. THERE ARE THREE DATA TYPES, THUS THREE
46 -- SECTIONS.
49 -- FOR EACH DATA TYPE, THE 30 TESTS ARE DIVIDED INTO 3 "SEGMENTS"
51 -- << NOTE: THE NUMBER OF SEGMENTS IS WRITTEN " 3 " ,
52 -- THE NUMBER OF SECTIONS IS WRITTEN "THREE" >>
54 -- (OF 10 TESTS EACH, EXCEPT 10,10,6 FOR 'CHARACTER'), NUMBERED
55 -- 0 , 1 , 2 AND CORRESPONDING TO THE 3 SIGNIFICANTLY DIFFERENT
56 -- POSITIONS OF AN EXIT STATEMENT WITH RESPECT TO THE LOOP IT IS IN
57 -- ( "AT THE VERY TOP" , "AT THE VERY BOTTOM" , "ANYWHERE IN BETWEEN"
58 -- ). AT THE BEGINNING OF EACH TEST, THE VARIABLE WHICH_SEGMENT
59 -- IS UPDATED TO CONTAIN THE NEW VALUE OF THIS IDENTIFYING NUMBER
60 -- (FOR THE TEST ABOUT TO BEGIN):
62 -- EXIT AT THE TOP ........ WHICH_SEGMENT = 0
63 -- EXIT FROM THE MIDDLE ........ WHICH_SEGMENT = 1
64 -- EXIT AT THE BOTTOM ........ WHICH_SEGMENT = 2 .
67 -- WITHIN EACH SECTION, THE TESTS ARE NUMBERED FROM 1 TO 30
68 -- (26 FOR 'CHARACTER'). THIS NUMBER IS STORED IN THE INTEGER
69 -- VARIABLE INT_I (EQUAL TO THE CURRENT VALUE OF THE OUTER-LOOP
70 -- INDEX WHEN THAT INDEX IS OF INTEGER TYPE), WHOSE APPROPRIATE VALUE
71 -- FOR EACH TEST IS SET AT THE BEGINNING OF THE TEST.
74 -- AS PART OF THE EVALUATION PROCESS, THE PROGRAM COMPUTES FOR EACH
75 -- TEST (I.E. FOR EACH VALUE OF I , OR OF INT_I ) THE APPROPRIATE
76 -- NUMBER OF INNER-LOOP ITERATIONS REQUIRED BEFORE EXIT; THIS IS
77 -- THE EXPECTED VALUE OF J (EXPRESSED AS AN INTEGER IN THE RANGE
78 -- 1..10 ) AND STORES IT IN EXPECTED_J . FOR EACH OF THE THREE
79 -- SECTIONS, THE TIME SEQUENCE OF THESE 30 VALUES IS
81 -- 1 2 3 4 5 6 7 8 9 10 << SEGMENT 1 >>
82 -- 6 6 7 7 8 8 9 9 10 10 << SEGMENT 2 >>
83 -- 7 8 8 8 9 9 9 10 10 10 << SEGMENT 3 >>
85 -- (EACH SECTION GETS ALL 3 ROWS, NOT ONE ROW PER SECTION;
86 -- FOR 'CHARACTER', WHERE ONLY 26 VALUES ARE REQUIRED, THE LAST 4
87 -- VALUES ARE OMITTED). THIS NUMBER IS COMPARED WITH THE ACTUAL
88 -- VALUE OF J (ACTUAL NUMBER OF INNER-LOOP ITERATIONS BEFORE THE
89 -- EXECUTION OF THE EXIT STATEMENT) AS SAVED JUST BEFORE THE EXIT
90 -- FROM THE LOOP (AGAIN IN THE FORM OF AN INTEGER IN THE RANGE
91 -- 1..30 , IRRESPECTIVE OF THE DATA TYPE BEING TESTED), I F
92 -- SUCH SAVED VALUE IS AVAILABLE.
95 -- THE ACTUAL VALUE OF INNER-LOOP ITERATIONS (AS SAVED IMMEDIATELY
96 -- BEFORE THE EXIT, AS OPPOSED TO A VALUE LEFT OVER FROM SOME
97 -- PREVIOUS ITERATION) IS AVAILABLE ONLY IF WHICH_SEGMENT /= 0 ,
98 -- AND IS THEN STORED IN SAVE_J .
101 -- FOR THE CASE WHICH_SEGMENT = 0 , THE ITERATIONS ARE COUNTED IN
102 -- THE VARIABLE COUNT , WHOSE VALUE AT THE COMPLETION OF THE
103 -- I-TH TEST ( I IN 1..10 ) MUST BE EQUAL TO EXPECTED_J - 1 ,
104 -- AND THUS TO I - 1 (METHODOLOGICALLY AS WELL AS COMPUTATIONALLY
105 -- THIS IS NO DIFFERENT FROM USING THE MOST RECENT VALUE OF SAVE_J
106 -- WHEN A CURRENT ONE CANNOT BE OBTAINED). AFTER BEING INCREMENTED
107 -- BY 1 , COUNT IS CHECKED AGAINST EXPECTED_J .
110 -- THIS CONCLUDES THE DESCRIPTION OF THE CASE WHICH_SEGMENT = 0 ,
111 -- AND THUS OF THE ALGORITHM. THE ONLY REASON FOR SPLITTING THE
112 -- CASE WHICH_SEGMENT /= 0 INTO TWO IS THE DESIRE TO PROVIDE FOR
113 -- DISTINCT MESSAGES.
117 -- RM 04/23/81
118 -- SPS 3/7/83
120 WITH REPORT;
121 PROCEDURE C57003A IS
123 USE REPORT ;
125 BEGIN
127 TEST( "C57003A" , "TEST THAT THE EXIT STATEMENT IS EVALUATED" &
128 " EACH TIME THROUGH THE LOOP" );
130 DECLARE
132 WHICH_SEGMENT : INTEGER RANGE 0..2 ; -- BOUNDS ARE TIGHT
133 SAVE_J : INTEGER RANGE 1..10 ;
134 EXPECTED_J : INTEGER RANGE 1..10 ;
135 COUNT : INTEGER RANGE 0..100 := 0 ;
136 INT_I : INTEGER RANGE 1..30 ;
138 TYPE ENUM IS ( CHANGE_THE_ORIGIN_FROM_0_TO_1 ,
140 A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9 , A10 ,
141 A11, A12, A13, A14, A15, A16, A17, A18, A19, A20 ,
142 A21, A22, A23, A24, A25, A26, A27, A28, A29, A30 );
144 BEGIN
147 --------------------------------------------------------------
148 ----------------------- INTEGER ----------------------------
151 FOR I IN INTEGER RANGE 1..30 LOOP
154 WHICH_SEGMENT := ( I - 1 ) / 10 ;
155 EXPECTED_J := ( I + WHICH_SEGMENT ) /
156 ( WHICH_SEGMENT + 1 ) ;
158 COUNT := 0 ;
161 FOR J IN INTEGER RANGE 1..10 LOOP
163 -- J NOT SAVED HERE (SO THAT 'EXIT' BE FIRST STMT)
165 EXIT WHEN WHICH_SEGMENT = 0 AND
166 1*J >= I ;--COUNT+:=1 ON NXT LINE INSTEAD
167 COUNT := COUNT + 1 ;
169 NULL ;
170 NULL ;
171 NULL ;
172 SAVE_J := J ;
173 EXIT WHEN WHICH_SEGMENT = 1 AND
174 2*J >= I ;
176 NULL ;
177 NULL ;
178 NULL ;
179 SAVE_J := J ;
180 EXIT WHEN WHICH_SEGMENT = 2 AND
181 3*J >= I ;
183 END LOOP;
186 COUNT := COUNT + 1 ; -- SEE HEADER
188 CASE WHICH_SEGMENT IS
189 WHEN 0 =>
190 IF COUNT /= EXPECTED_J THEN
191 FAILED( "WRONG COUNT; INT, EXIT AT TOP" );
192 END IF;
193 WHEN 1 => -- WOULD WORK ALSO FOR 0
194 IF SAVE_J /= EXPECTED_J THEN
195 FAILED( "WRONG COUNT; I,EXIT AT MIDDLE" );
196 END IF;
197 WHEN 2 =>
198 IF SAVE_J /= EXPECTED_J THEN
199 FAILED( "WRONG COUNT; I,EXIT AT BOTTOM" );
200 END IF;
201 END CASE;
203 END LOOP;
207 --------------------------------------------------------------
208 ---------------------- CHARACTER ---------------------------
211 FOR I IN CHARACTER RANGE 'A'..'Z' LOOP
213 INT_I := CHARACTER'POS(I) - CHARACTER'POS('A') + 1;
215 WHICH_SEGMENT := ( INT_I - 1 ) / 10 ;
216 EXPECTED_J := ( INT_I + WHICH_SEGMENT ) /
217 ( WHICH_SEGMENT + 1 ) ;
219 COUNT := 0 ;
222 FOR J IN CHARACTER RANGE 'A'..'J' LOOP
224 -- J NOT SAVED HERE (SO THAT 'EXIT' BE FIRST STMT)
226 EXIT WHEN WHICH_SEGMENT = 0 AND
227 J >= I ; -- COUNT+:=1 ON NXT LINE INSTEAD
228 COUNT := COUNT + 1 ;
230 NULL ;
231 NULL ;
232 NULL ;
233 SAVE_J := CHARACTER'POS(J) - CHARACTER'POS('A') + 1;
234 EXIT WHEN WHICH_SEGMENT = 1 AND
235 2 * SAVE_J >= INT_I ;
237 NULL ;
238 NULL ;
239 NULL ;
240 EXIT WHEN WHICH_SEGMENT = 2 AND
241 3 * SAVE_J >= INT_I ;
243 END LOOP;
246 COUNT := COUNT + 1 ;
248 CASE WHICH_SEGMENT IS
249 WHEN 0 =>
250 IF COUNT /= EXPECTED_J THEN
251 FAILED( "WRONG COUNT;CHAR, EXIT AT TOP" );
252 END IF;
253 WHEN 1 => -- WOULD WORK ALSO FOR 0
254 IF SAVE_J /= EXPECTED_J THEN
255 FAILED( "WRONG COUNT; C,EXIT AT MIDDLE" );
256 END IF;
257 WHEN 2 =>
258 IF SAVE_J /= EXPECTED_J THEN
259 FAILED( "WRONG COUNT; C,EXIT AT BOTTOM" );
260 END IF;
261 END CASE;
263 END LOOP;
267 --------------------------------------------------------------
268 --------------------- ENUMERATION --------------------------
271 FOR I IN ENUM RANGE A1..A30 LOOP
274 INT_I := ENUM'POS(I) ;
276 WHICH_SEGMENT := ( INT_I - 1 ) / 10 ;
277 EXPECTED_J := ( INT_I + WHICH_SEGMENT ) /
278 ( WHICH_SEGMENT + 1 ) ;
280 COUNT := 0 ;
283 FOR J IN ENUM RANGE A1..A10 LOOP
285 -- J NOT SAVED HERE (SO THAT 'EXIT' BE FIRST STMT)
287 EXIT WHEN WHICH_SEGMENT = 0 AND
288 J >= I ; -- COUNT+:=1 ON NXT LINE INSTEAD
289 COUNT := COUNT + 1 ;
291 NULL ;
292 NULL ;
293 NULL ;
294 SAVE_J := ENUM'POS(J) ;
295 EXIT WHEN WHICH_SEGMENT = 1 AND
296 2 * SAVE_J >= INT_I ;
298 NULL ;
299 NULL ;
300 NULL ;
301 EXIT WHEN WHICH_SEGMENT = 2 AND
302 3 * SAVE_J >= INT_I ;
304 END LOOP;
307 COUNT := COUNT + 1 ;
309 CASE WHICH_SEGMENT IS
310 WHEN 0 =>
311 IF COUNT /= EXPECTED_J THEN
312 FAILED( "WRONG COUNT;ENUM, EXIT AT TOP" );
313 END IF;
314 WHEN 1 => -- WOULD WORK ALSO FOR 0
315 IF SAVE_J /= EXPECTED_J THEN
316 FAILED( "WRONG COUNT; E,EXIT AT MIDDLE" );
317 END IF;
318 WHEN 2 =>
319 IF SAVE_J /= EXPECTED_J THEN
320 FAILED( "WRONG COUNT; E,EXIT AT BOTTOM" );
321 END IF;
322 END CASE;
324 END LOOP;
326 --------------------------------------------------------------
328 END ;
331 RESULT ;
334 END C57003A ;