| -- CC3007B.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 NAMES IN A GENERIC INSTANTIATION ARE STATICALLY |
| -- IDENTIFIED (I.E., BOUND) AT THE TEXTUAL POINT OF THE INSTANTIA- |
| -- TION, AND ARE BOUND BEFORE BEING "SUBSTITUTED" FOR THE COR- |
| -- RESPONDING GENERIC FORMAL PARAMETERS IN THE SPECIFICATION AND |
| -- BODY TEMPLATES. |
| -- |
| -- SEE AI-00365/05-BI-WJ. |
| |
| -- HISTORY: |
| -- EDWARD V. BERARD, 15 AUGUST 1990 |
| -- DAS 08 OCT 90 CHANGED INSTANTIATIONS TO USE VARIABLES |
| -- M1 AND M2 IN THE FIRST_BLOCK INSTANTIA- |
| -- TION AND TO ASSIGN THIRD_DATE AND |
| -- FOURTH_DATE VALUES BEFORE AND AFTER THE |
| -- SECOND_BLOCK INSTANTIATION. |
| |
| WITH REPORT; |
| |
| PROCEDURE CC3007B IS |
| |
| INCREMENTED_VALUE : NATURAL := 0; |
| |
| TYPE MONTH_TYPE IS (JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, |
| SEP, OCT, NOV, DEC); |
| TYPE DAY_TYPE IS RANGE 1 .. 31; |
| TYPE YEAR_TYPE IS RANGE 1904 .. 2050; |
| TYPE DATE IS RECORD |
| MONTH : MONTH_TYPE; |
| DAY : DAY_TYPE; |
| YEAR : YEAR_TYPE; |
| END RECORD; |
| |
| TYPE DATE_ACCESS IS ACCESS DATE; |
| |
| TODAY : DATE := (MONTH => AUG, |
| DAY => 8, |
| YEAR => 1990); |
| |
| CHRISTMAS : DATE := (MONTH => DEC, |
| DAY => 25, |
| YEAR => 1948); |
| |
| WALL_DATE : DATE := (MONTH => NOV, |
| DAY => 9, |
| YEAR => 1989); |
| |
| BIRTH_DATE : DATE := (MONTH => OCT, |
| DAY => 3, |
| YEAR => 1949); |
| |
| FIRST_DUE_DATE : DATE := (MONTH => JAN, |
| DAY => 23, |
| YEAR => 1990); |
| |
| LAST_DUE_DATE : DATE := (MONTH => DEC, |
| DAY => 20, |
| YEAR => 1990); |
| |
| THIS_MONTH : MONTH_TYPE := AUG; |
| |
| STORED_RECORD : DATE := TODAY; |
| |
| STORED_INDEX : MONTH_TYPE := AUG; |
| |
| FIRST_DATE : DATE_ACCESS := NEW DATE'(WALL_DATE); |
| SECOND_DATE : DATE_ACCESS := FIRST_DATE; |
| |
| THIRD_DATE : DATE_ACCESS := NEW DATE'(BIRTH_DATE); |
| FOURTH_DATE : DATE_ACCESS := NEW DATE'(CHRISTMAS); |
| |
| TYPE DUE_DATES IS ARRAY (MONTH_TYPE RANGE JAN .. DEC) OF DATE; |
| REPORT_DATES : DUE_DATES := ((JAN, 23, 1990), (FEB, 23, 1990), |
| (MAR, 23, 1990), (APR, 23, 1990), |
| (MAY, 23, 1990), (JUN, 22, 1990), |
| (JUL, 23, 1990), (AUG, 23, 1990), |
| (SEP, 24, 1990), (OCT, 23, 1990), |
| (NOV, 23, 1990), (DEC, 20, 1990)); |
| |
| GENERIC |
| |
| NATURALLY : IN NATURAL; |
| FIRST_RECORD : IN OUT DATE; |
| SECOND_RECORD : IN OUT DATE; |
| TYPE RECORD_POINTER IS ACCESS DATE; |
| POINTER : IN OUT RECORD_POINTER; |
| TYPE ARRAY_TYPE IS ARRAY (MONTH_TYPE) OF DATE; |
| THIS_ARRAY : IN OUT ARRAY_TYPE; |
| FIRST_ARRAY_ELEMENT : IN OUT DATE; |
| SECOND_ARRAY_ELEMENT : IN OUT DATE; |
| INDEX_ELEMENT : IN OUT MONTH_TYPE; |
| POINTER_TEST : IN OUT DATE; |
| ANOTHER_POINTER_TEST : IN OUT DATE; |
| |
| PACKAGE TEST_ACTUAL_PARAMETERS IS |
| |
| PROCEDURE EVALUATE_FUNCTION; |
| PROCEDURE CHECK_RECORDS; |
| PROCEDURE CHECK_ACCESS; |
| PROCEDURE CHECK_ARRAY; |
| PROCEDURE CHECK_ARRAY_ELEMENTS; |
| PROCEDURE CHECK_SCALAR; |
| PROCEDURE CHECK_POINTERS; |
| |
| END TEST_ACTUAL_PARAMETERS; |
| |
| PACKAGE BODY TEST_ACTUAL_PARAMETERS IS |
| |
| PROCEDURE EVALUATE_FUNCTION IS |
| BEGIN -- EVALUATE_FUNCTION |
| |
| IF (INCREMENTED_VALUE = 0) OR |
| (NATURALLY /= INCREMENTED_VALUE) THEN |
| REPORT.FAILED ("PROBLEMS EVALUATING FUNCTION " & |
| "PARAMETER."); |
| END IF; |
| |
| END EVALUATE_FUNCTION; |
| |
| PROCEDURE CHECK_RECORDS IS |
| |
| STORE : DATE; |
| |
| BEGIN -- CHECK_RECORDS |
| |
| IF STORED_RECORD /= FIRST_RECORD THEN |
| REPORT.FAILED ("PROBLEM WITH RECORD TYPES"); |
| ELSE |
| STORED_RECORD := SECOND_RECORD; |
| STORE := FIRST_RECORD; |
| FIRST_RECORD := SECOND_RECORD; |
| SECOND_RECORD := STORE; |
| END IF; |
| |
| END CHECK_RECORDS; |
| |
| PROCEDURE CHECK_ACCESS IS |
| BEGIN -- CHECK_ACCESS |
| |
| IF ((INCREMENTED_VALUE / 2) * 2) /= INCREMENTED_VALUE |
| THEN |
| IF POINTER.ALL /= DATE'(WALL_DATE) THEN |
| REPORT.FAILED ("PROBLEM WITH ACCESS TYPES " & |
| "- 1"); |
| ELSE |
| POINTER.ALL := DATE'(BIRTH_DATE); |
| END IF; |
| ELSE |
| IF POINTER.ALL /= DATE'(BIRTH_DATE) THEN |
| REPORT.FAILED ("PROBLEM WITH ACCESS TYPES " & |
| "- 2"); |
| ELSE |
| POINTER.ALL := DATE'(WALL_DATE); |
| END IF; |
| END IF; |
| |
| END CHECK_ACCESS; |
| |
| PROCEDURE CHECK_ARRAY IS |
| |
| STORE : DATE; |
| |
| BEGIN -- CHECK_ARRAY |
| |
| IF ((INCREMENTED_VALUE / 2) * 2) /= INCREMENTED_VALUE |
| THEN |
| IF THIS_ARRAY (THIS_ARRAY'FIRST) /= FIRST_DUE_DATE |
| THEN |
| REPORT.FAILED ("PROBLEM WITH ARRAY TYPES - 1"); |
| ELSE |
| THIS_ARRAY (THIS_ARRAY'FIRST) := LAST_DUE_DATE; |
| THIS_ARRAY (THIS_ARRAY'LAST) := FIRST_DUE_DATE; |
| END IF; |
| ELSE |
| IF THIS_ARRAY (THIS_ARRAY'FIRST) /= LAST_DUE_DATE |
| THEN |
| REPORT.FAILED ("PROBLEM WITH ARRAY TYPES - 2"); |
| ELSE |
| THIS_ARRAY (THIS_ARRAY'FIRST) := |
| FIRST_DUE_DATE; |
| THIS_ARRAY (THIS_ARRAY'LAST) := LAST_DUE_DATE; |
| END IF; |
| END IF; |
| |
| END CHECK_ARRAY; |
| |
| PROCEDURE CHECK_ARRAY_ELEMENTS IS |
| |
| STORE : DATE; |
| |
| BEGIN -- CHECK_ARRAY_ELEMENTS |
| |
| IF ((INCREMENTED_VALUE / 2) * 2) /= INCREMENTED_VALUE |
| THEN |
| IF (FIRST_ARRAY_ELEMENT.MONTH /= MAY) OR |
| (SECOND_ARRAY_ELEMENT.DAY /= 22) THEN |
| REPORT.FAILED ("PROBLEM WITH ARRAY ELEMENTS " & |
| "- 1"); |
| ELSE |
| STORE := FIRST_ARRAY_ELEMENT; |
| FIRST_ARRAY_ELEMENT := SECOND_ARRAY_ELEMENT; |
| SECOND_ARRAY_ELEMENT := STORE; |
| END IF; |
| ELSE |
| IF (FIRST_ARRAY_ELEMENT.MONTH /= JUN) OR |
| (SECOND_ARRAY_ELEMENT.DAY /= 23) THEN |
| REPORT.FAILED ("PROBLEM WITH ARRAY ELEMENTS " & |
| "- 2"); |
| ELSE |
| STORE := FIRST_ARRAY_ELEMENT; |
| FIRST_ARRAY_ELEMENT := SECOND_ARRAY_ELEMENT; |
| SECOND_ARRAY_ELEMENT := STORE; |
| END IF; |
| END IF; |
| |
| END CHECK_ARRAY_ELEMENTS; |
| |
| PROCEDURE CHECK_SCALAR IS |
| BEGIN -- CHECK_SCALAR |
| |
| IF ((INCREMENTED_VALUE / 2) * 2) /= INCREMENTED_VALUE |
| THEN |
| IF INDEX_ELEMENT /= STORED_INDEX THEN |
| REPORT.FAILED ("PROBLEM WITH INDEX TYPES - 1"); |
| ELSE |
| INDEX_ELEMENT := |
| MONTH_TYPE'SUCC(INDEX_ELEMENT); |
| STORED_INDEX := INDEX_ELEMENT; |
| END IF; |
| ELSE |
| IF INDEX_ELEMENT /= STORED_INDEX THEN |
| REPORT.FAILED ("PROBLEM WITH INDEX TYPES - 2"); |
| ELSE |
| INDEX_ELEMENT := |
| MONTH_TYPE'PRED (INDEX_ELEMENT); |
| STORED_INDEX := INDEX_ELEMENT; |
| END IF; |
| END IF; |
| |
| END CHECK_SCALAR; |
| |
| PROCEDURE CHECK_POINTERS IS |
| |
| STORE : DATE; |
| |
| BEGIN -- CHECK_POINTERS |
| |
| IF ((INCREMENTED_VALUE / 2) * 2) /= INCREMENTED_VALUE |
| THEN |
| IF (POINTER_TEST /= DATE'(OCT, 3, 1949)) OR |
| (ANOTHER_POINTER_TEST /= DATE'(DEC, 25, 1948)) |
| THEN |
| REPORT.FAILED ("PROBLEM WITH POINTER TEST " & |
| "- 1"); |
| ELSE |
| STORE := POINTER_TEST; |
| POINTER_TEST := ANOTHER_POINTER_TEST; |
| ANOTHER_POINTER_TEST := STORE; |
| END IF; |
| ELSE |
| IF (POINTER_TEST /= DATE'(DEC, 25, 1948)) OR |
| (ANOTHER_POINTER_TEST /= DATE'(OCT, 3, 1949)) |
| THEN |
| REPORT.FAILED ("PROBLEM WITH POINTER TEST " & |
| "- 2"); |
| ELSE |
| STORE := POINTER_TEST; |
| POINTER_TEST := ANOTHER_POINTER_TEST; |
| ANOTHER_POINTER_TEST := STORE; |
| END IF; |
| END IF; |
| |
| END CHECK_POINTERS; |
| |
| END TEST_ACTUAL_PARAMETERS; |
| |
| FUNCTION INC RETURN NATURAL IS |
| BEGIN -- INC |
| INCREMENTED_VALUE := NATURAL'SUCC (INCREMENTED_VALUE); |
| RETURN INCREMENTED_VALUE; |
| END INC; |
| |
| BEGIN -- CC3007B |
| |
| REPORT.TEST ("CC3007B", "CHECK THAT THE NAMES IN A GENERIC " & |
| "INSTANTIATION ARE STAICALLY IDENTIFIED (I.E., " & |
| "BOUND) AT THE TEXTUAL POINT OF THE INSTANTIATION" & |
| ", AND ARE BOUND BEFORE BEING SUBSTITUTED FOR " & |
| "THE CORRESPONDING GENERIC FORMAL PARAMETERS IN " & |
| "THE SPECIFICATION AND BODY TEMPLATES. " & |
| "SEE AI-00365/05-BI-WJ."); |
| |
| FIRST_BLOCK: |
| |
| DECLARE |
| |
| M1 : MONTH_TYPE := MAY; |
| M2 : MONTH_TYPE := JUN; |
| |
| PACKAGE NEW_TEST_ACTUAL_PARAMETERS IS |
| NEW TEST_ACTUAL_PARAMETERS ( |
| NATURALLY => INC, |
| FIRST_RECORD => TODAY, |
| SECOND_RECORD => CHRISTMAS, |
| RECORD_POINTER => DATE_ACCESS, |
| POINTER => SECOND_DATE, |
| ARRAY_TYPE => DUE_DATES, |
| THIS_ARRAY => REPORT_DATES, |
| FIRST_ARRAY_ELEMENT => REPORT_DATES (M1), |
| SECOND_ARRAY_ELEMENT => REPORT_DATES (M2), |
| INDEX_ELEMENT => THIS_MONTH, |
| POINTER_TEST => THIRD_DATE.ALL, |
| ANOTHER_POINTER_TEST => FOURTH_DATE.ALL); |
| |
| BEGIN -- FIRST_BLOCK |
| |
| REPORT.COMMENT ("ENTERING FIRST BLOCK"); |
| NEW_TEST_ACTUAL_PARAMETERS.EVALUATE_FUNCTION; |
| NEW_TEST_ACTUAL_PARAMETERS.CHECK_SCALAR; |
| M1 := SEP; |
| M2 := OCT; |
| -- NEW_TEST_ACTUAL_PARAMETERS SHOULD USE THE PREVIOUS |
| -- VALUES OF MAY AND JUN. |
| NEW_TEST_ACTUAL_PARAMETERS.CHECK_ARRAY; |
| NEW_TEST_ACTUAL_PARAMETERS.CHECK_ARRAY_ELEMENTS; |
| NEW_TEST_ACTUAL_PARAMETERS.CHECK_ACCESS; |
| NEW_TEST_ACTUAL_PARAMETERS.CHECK_RECORDS; |
| NEW_TEST_ACTUAL_PARAMETERS.CHECK_POINTERS; |
| |
| END FIRST_BLOCK; |
| |
| SECOND_BLOCK: |
| |
| DECLARE |
| |
| SAVE_THIRD_DATE : DATE_ACCESS := THIRD_DATE; |
| SAVE_FOURTH_DATE : DATE_ACCESS := FOURTH_DATE; |
| |
| PACKAGE NEW_TEST_ACTUAL_PARAMETERS IS |
| NEW TEST_ACTUAL_PARAMETERS ( |
| NATURALLY => INC, |
| FIRST_RECORD => TODAY, |
| SECOND_RECORD => CHRISTMAS, |
| RECORD_POINTER => DATE_ACCESS, |
| POINTER => SECOND_DATE, |
| ARRAY_TYPE => DUE_DATES, |
| THIS_ARRAY => REPORT_DATES, |
| FIRST_ARRAY_ELEMENT => REPORT_DATES (MAY), |
| SECOND_ARRAY_ELEMENT => REPORT_DATES (JUN), |
| INDEX_ELEMENT => THIS_MONTH, |
| POINTER_TEST => THIRD_DATE.ALL, |
| ANOTHER_POINTER_TEST => FOURTH_DATE.ALL); |
| |
| BEGIN -- SECOND_BLOCK |
| |
| REPORT.COMMENT ("ENTERING SECOND BLOCK"); |
| NEW_TEST_ACTUAL_PARAMETERS.EVALUATE_FUNCTION; |
| NEW_TEST_ACTUAL_PARAMETERS.CHECK_SCALAR; |
| NEW_TEST_ACTUAL_PARAMETERS.CHECK_ARRAY; |
| NEW_TEST_ACTUAL_PARAMETERS.CHECK_ARRAY_ELEMENTS; |
| NEW_TEST_ACTUAL_PARAMETERS.CHECK_ACCESS; |
| NEW_TEST_ACTUAL_PARAMETERS.CHECK_RECORDS; |
| |
| THIRD_DATE := NEW DATE'(JUL, 13, 1951); |
| FOURTH_DATE := NEW DATE'(JUL, 4, 1976); |
| NEW_TEST_ACTUAL_PARAMETERS.CHECK_POINTERS; |
| THIRD_DATE := SAVE_THIRD_DATE; |
| FOURTH_DATE := SAVE_FOURTH_DATE; |
| |
| END SECOND_BLOCK; |
| |
| REPORT.RESULT; |
| |
| END CC3007B; |