diff options
Diffstat (limited to 'gcc/testsuite/ada/acats/tests/c5/c57003a.ada')
-rw-r--r-- | gcc/testsuite/ada/acats/tests/c5/c57003a.ada | 334 |
1 files changed, 334 insertions, 0 deletions
diff --git a/gcc/testsuite/ada/acats/tests/c5/c57003a.ada b/gcc/testsuite/ada/acats/tests/c5/c57003a.ada new file mode 100644 index 000000000..8ca95e52e --- /dev/null +++ b/gcc/testsuite/ada/acats/tests/c5/c57003a.ada @@ -0,0 +1,334 @@ +-- C57003A.ADA + +-- Grant of Unlimited Rights +-- +-- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687, +-- F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained +-- unlimited rights in the software and documentation contained herein. +-- Unlimited rights are defined in DFAR 252.227-7013(a)(19). By making +-- this public release, the Government intends to confer upon all +-- recipients unlimited rights equal to those held by the Government. +-- These rights include rights to use, duplicate, release or disclose the +-- released technical data and computer software in whole or in part, in +-- any manner and for any purpose whatsoever, and to have or permit others +-- to do so. +-- +-- DISCLAIMER +-- +-- ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR +-- DISCLOSED ARE AS IS. THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED +-- WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE +-- SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE +-- OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A +-- PARTICULAR PURPOSE OF SAID MATERIAL. +--* +-- CHECK THAT THE EXIT STATEMENT IS EVALUATED EACH TIME THROUGH A LOOP, +-- AND THAT IT IS EVALUATED CORRECTLY WHETHER POSITIONED AT THE +-- BEGINNING, MIDDLE, OR END OF THE LOOP. + + + +-- EACH TEST IS A LOOP ON J WHERE THE EXIT CONDITIONS ARE TO EVALUATE +-- TO 'FALSE' A CERTAIN NUMBER OF TIMES UNTIL, AT THE APPROPRIATE +-- TIME, ONE OF THEM EVALUATES TO 'TRUE' AND CAUSES THE LOOP TO BE +-- EXITED. +-- +-- +-- THE TEST IS PERFORMED 30 TIMES FOR EACH OF THE FIRST TWO +-- DATA TYPES CONSIDERED ('INTEGER', USER-DEFINED ENUMERATION) +-- AND 26 TIMES FOR 'CHARACTER' (THUS 86 TIMES ALTOGETHER). +-- +-- +-- EACH DATA TYPE HAS ITS OWN SEPARATE SECTION OF CODE. ALL SECTIONS +-- FOLLOW THE SAME TESTING ALGORITHM (MUTATIS MUTANDIS). THE CALCU- +-- LATIONS WHICH KEEP TRACK OF THE FLOW OF CONTROL ARE ALL DONE IN +-- INTEGER ARITHMETIC. THERE ARE THREE DATA TYPES, THUS THREE +-- SECTIONS. +-- +-- +-- FOR EACH DATA TYPE, THE 30 TESTS ARE DIVIDED INTO 3 "SEGMENTS" +-- +-- << NOTE: THE NUMBER OF SEGMENTS IS WRITTEN " 3 " , +-- THE NUMBER OF SECTIONS IS WRITTEN "THREE" >> +-- +-- (OF 10 TESTS EACH, EXCEPT 10,10,6 FOR 'CHARACTER'), NUMBERED +-- 0 , 1 , 2 AND CORRESPONDING TO THE 3 SIGNIFICANTLY DIFFERENT +-- POSITIONS OF AN EXIT STATEMENT WITH RESPECT TO THE LOOP IT IS IN +-- ( "AT THE VERY TOP" , "AT THE VERY BOTTOM" , "ANYWHERE IN BETWEEN" +-- ). AT THE BEGINNING OF EACH TEST, THE VARIABLE WHICH_SEGMENT +-- IS UPDATED TO CONTAIN THE NEW VALUE OF THIS IDENTIFYING NUMBER +-- (FOR THE TEST ABOUT TO BEGIN): +-- +-- EXIT AT THE TOP ........ WHICH_SEGMENT = 0 +-- EXIT FROM THE MIDDLE ........ WHICH_SEGMENT = 1 +-- EXIT AT THE BOTTOM ........ WHICH_SEGMENT = 2 . +-- +-- +-- WITHIN EACH SECTION, THE TESTS ARE NUMBERED FROM 1 TO 30 +-- (26 FOR 'CHARACTER'). THIS NUMBER IS STORED IN THE INTEGER +-- VARIABLE INT_I (EQUAL TO THE CURRENT VALUE OF THE OUTER-LOOP +-- INDEX WHEN THAT INDEX IS OF INTEGER TYPE), WHOSE APPROPRIATE VALUE +-- FOR EACH TEST IS SET AT THE BEGINNING OF THE TEST. +-- +-- +-- AS PART OF THE EVALUATION PROCESS, THE PROGRAM COMPUTES FOR EACH +-- TEST (I.E. FOR EACH VALUE OF I , OR OF INT_I ) THE APPROPRIATE +-- NUMBER OF INNER-LOOP ITERATIONS REQUIRED BEFORE EXIT; THIS IS +-- THE EXPECTED VALUE OF J (EXPRESSED AS AN INTEGER IN THE RANGE +-- 1..10 ) AND STORES IT IN EXPECTED_J . FOR EACH OF THE THREE +-- SECTIONS, THE TIME SEQUENCE OF THESE 30 VALUES IS +-- +-- 1 2 3 4 5 6 7 8 9 10 << SEGMENT 1 >> +-- 6 6 7 7 8 8 9 9 10 10 << SEGMENT 2 >> +-- 7 8 8 8 9 9 9 10 10 10 << SEGMENT 3 >> +-- +-- (EACH SECTION GETS ALL 3 ROWS, NOT ONE ROW PER SECTION; +-- FOR 'CHARACTER', WHERE ONLY 26 VALUES ARE REQUIRED, THE LAST 4 +-- VALUES ARE OMITTED). THIS NUMBER IS COMPARED WITH THE ACTUAL +-- VALUE OF J (ACTUAL NUMBER OF INNER-LOOP ITERATIONS BEFORE THE +-- EXECUTION OF THE EXIT STATEMENT) AS SAVED JUST BEFORE THE EXIT +-- FROM THE LOOP (AGAIN IN THE FORM OF AN INTEGER IN THE RANGE +-- 1..30 , IRRESPECTIVE OF THE DATA TYPE BEING TESTED), I F +-- SUCH SAVED VALUE IS AVAILABLE. +-- +-- +-- THE ACTUAL VALUE OF INNER-LOOP ITERATIONS (AS SAVED IMMEDIATELY +-- BEFORE THE EXIT, AS OPPOSED TO A VALUE LEFT OVER FROM SOME +-- PREVIOUS ITERATION) IS AVAILABLE ONLY IF WHICH_SEGMENT /= 0 , +-- AND IS THEN STORED IN SAVE_J . +-- +-- +-- FOR THE CASE WHICH_SEGMENT = 0 , THE ITERATIONS ARE COUNTED IN +-- THE VARIABLE COUNT , WHOSE VALUE AT THE COMPLETION OF THE +-- I-TH TEST ( I IN 1..10 ) MUST BE EQUAL TO EXPECTED_J - 1 , +-- AND THUS TO I - 1 (METHODOLOGICALLY AS WELL AS COMPUTATIONALLY +-- THIS IS NO DIFFERENT FROM USING THE MOST RECENT VALUE OF SAVE_J +-- WHEN A CURRENT ONE CANNOT BE OBTAINED). AFTER BEING INCREMENTED +-- BY 1 , COUNT IS CHECKED AGAINST EXPECTED_J . +-- +-- +-- THIS CONCLUDES THE DESCRIPTION OF THE CASE WHICH_SEGMENT = 0 , +-- AND THUS OF THE ALGORITHM. THE ONLY REASON FOR SPLITTING THE +-- CASE WHICH_SEGMENT /= 0 INTO TWO IS THE DESIRE TO PROVIDE FOR +-- DISTINCT MESSAGES. + + + +-- RM 04/23/81 +-- SPS 3/7/83 + +WITH REPORT; +PROCEDURE C57003A IS + + USE REPORT ; + +BEGIN + + TEST( "C57003A" , "TEST THAT THE EXIT STATEMENT IS EVALUATED" & + " EACH TIME THROUGH THE LOOP" ); + + DECLARE + + WHICH_SEGMENT : INTEGER RANGE 0..2 ; -- BOUNDS ARE TIGHT + SAVE_J : INTEGER RANGE 1..10 ; + EXPECTED_J : INTEGER RANGE 1..10 ; + COUNT : INTEGER RANGE 0..100 := 0 ; + INT_I : INTEGER RANGE 1..30 ; + + TYPE ENUM IS ( CHANGE_THE_ORIGIN_FROM_0_TO_1 , + + A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9 , A10 , + A11, A12, A13, A14, A15, A16, A17, A18, A19, A20 , + A21, A22, A23, A24, A25, A26, A27, A28, A29, A30 ); + + BEGIN + + + -------------------------------------------------------------- + ----------------------- INTEGER ---------------------------- + + + FOR I IN INTEGER RANGE 1..30 LOOP + + + WHICH_SEGMENT := ( I - 1 ) / 10 ; + EXPECTED_J := ( I + WHICH_SEGMENT ) / + ( WHICH_SEGMENT + 1 ) ; + + COUNT := 0 ; + + + FOR J IN INTEGER RANGE 1..10 LOOP + + -- J NOT SAVED HERE (SO THAT 'EXIT' BE FIRST STMT) + + EXIT WHEN WHICH_SEGMENT = 0 AND + 1*J >= I ;--COUNT+:=1 ON NXT LINE INSTEAD + COUNT := COUNT + 1 ; + + NULL ; + NULL ; + NULL ; + SAVE_J := J ; + EXIT WHEN WHICH_SEGMENT = 1 AND + 2*J >= I ; + + NULL ; + NULL ; + NULL ; + SAVE_J := J ; + EXIT WHEN WHICH_SEGMENT = 2 AND + 3*J >= I ; + + END LOOP; + + + COUNT := COUNT + 1 ; -- SEE HEADER + + CASE WHICH_SEGMENT IS + WHEN 0 => + IF COUNT /= EXPECTED_J THEN + FAILED( "WRONG COUNT; INT, EXIT AT TOP" ); + END IF; + WHEN 1 => -- WOULD WORK ALSO FOR 0 + IF SAVE_J /= EXPECTED_J THEN + FAILED( "WRONG COUNT; I,EXIT AT MIDDLE" ); + END IF; + WHEN 2 => + IF SAVE_J /= EXPECTED_J THEN + FAILED( "WRONG COUNT; I,EXIT AT BOTTOM" ); + END IF; + END CASE; + + END LOOP; + + + + -------------------------------------------------------------- + ---------------------- CHARACTER --------------------------- + + + FOR I IN CHARACTER RANGE 'A'..'Z' LOOP + + INT_I := CHARACTER'POS(I) - CHARACTER'POS('A') + 1; + + WHICH_SEGMENT := ( INT_I - 1 ) / 10 ; + EXPECTED_J := ( INT_I + WHICH_SEGMENT ) / + ( WHICH_SEGMENT + 1 ) ; + + COUNT := 0 ; + + + FOR J IN CHARACTER RANGE 'A'..'J' LOOP + + -- J NOT SAVED HERE (SO THAT 'EXIT' BE FIRST STMT) + + EXIT WHEN WHICH_SEGMENT = 0 AND + J >= I ; -- COUNT+:=1 ON NXT LINE INSTEAD + COUNT := COUNT + 1 ; + + NULL ; + NULL ; + NULL ; + SAVE_J := CHARACTER'POS(J) - CHARACTER'POS('A') + 1; + EXIT WHEN WHICH_SEGMENT = 1 AND + 2 * SAVE_J >= INT_I ; + + NULL ; + NULL ; + NULL ; + EXIT WHEN WHICH_SEGMENT = 2 AND + 3 * SAVE_J >= INT_I ; + + END LOOP; + + + COUNT := COUNT + 1 ; + + CASE WHICH_SEGMENT IS + WHEN 0 => + IF COUNT /= EXPECTED_J THEN + FAILED( "WRONG COUNT;CHAR, EXIT AT TOP" ); + END IF; + WHEN 1 => -- WOULD WORK ALSO FOR 0 + IF SAVE_J /= EXPECTED_J THEN + FAILED( "WRONG COUNT; C,EXIT AT MIDDLE" ); + END IF; + WHEN 2 => + IF SAVE_J /= EXPECTED_J THEN + FAILED( "WRONG COUNT; C,EXIT AT BOTTOM" ); + END IF; + END CASE; + + END LOOP; + + + + -------------------------------------------------------------- + --------------------- ENUMERATION -------------------------- + + + FOR I IN ENUM RANGE A1..A30 LOOP + + + INT_I := ENUM'POS(I) ; + + WHICH_SEGMENT := ( INT_I - 1 ) / 10 ; + EXPECTED_J := ( INT_I + WHICH_SEGMENT ) / + ( WHICH_SEGMENT + 1 ) ; + + COUNT := 0 ; + + + FOR J IN ENUM RANGE A1..A10 LOOP + + -- J NOT SAVED HERE (SO THAT 'EXIT' BE FIRST STMT) + + EXIT WHEN WHICH_SEGMENT = 0 AND + J >= I ; -- COUNT+:=1 ON NXT LINE INSTEAD + COUNT := COUNT + 1 ; + + NULL ; + NULL ; + NULL ; + SAVE_J := ENUM'POS(J) ; + EXIT WHEN WHICH_SEGMENT = 1 AND + 2 * SAVE_J >= INT_I ; + + NULL ; + NULL ; + NULL ; + EXIT WHEN WHICH_SEGMENT = 2 AND + 3 * SAVE_J >= INT_I ; + + END LOOP; + + + COUNT := COUNT + 1 ; + + CASE WHICH_SEGMENT IS + WHEN 0 => + IF COUNT /= EXPECTED_J THEN + FAILED( "WRONG COUNT;ENUM, EXIT AT TOP" ); + END IF; + WHEN 1 => -- WOULD WORK ALSO FOR 0 + IF SAVE_J /= EXPECTED_J THEN + FAILED( "WRONG COUNT; E,EXIT AT MIDDLE" ); + END IF; + WHEN 2 => + IF SAVE_J /= EXPECTED_J THEN + FAILED( "WRONG COUNT; E,EXIT AT BOTTOM" ); + END IF; + END CASE; + + END LOOP; + + -------------------------------------------------------------- + + END ; + + + RESULT ; + + +END C57003A ; |