-- CC3016C.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 AN INSTANCE OF A GENERIC PACKAGE MUST DECLARE A -- PACKAGE. CHECK THAT THE STATEMENTS IN AN INSTANTIATED GENERIC -- PACKAGE BODY ARE EXECUTED AFTER THE ELABORATION OF THE -- DECLARATIONS (IN SPEC AND IN BODY). -- HISTORY: -- EDWARD V. BERARD, 8 AUGUST 1990 WITH REPORT; PROCEDURE CC3016C IS GENERIC TYPE SOME_TYPE IS PRIVATE ; FIRST_INITIAL_VALUE : IN SOME_TYPE ; SECOND_INITIAL_VALUE : IN SOME_TYPE ; WITH PROCEDURE CHANGE (FIRST : IN SOME_TYPE ; RESULT : OUT SOME_TYPE) ; WITH PROCEDURE SECOND_CHANGE (FIRST : IN SOME_TYPE ; RESULT : OUT SOME_TYPE) ; WITH PROCEDURE THIRD_CHANGE (FIRST : IN SOME_TYPE ; RESULT : OUT SOME_TYPE) ; FIRST_EXPECTED_RESULT : IN SOME_TYPE ; SECOND_EXPECTED_RESULT : IN SOME_TYPE ; THIRD_EXPECTED_RESULT : IN SOME_TYPE ; FOURTH_EXPECTED_RESULT : IN SOME_TYPE ; FIFTH_EXPECTED_RESULT : IN SOME_TYPE ; SIXTH_EXPECTED_RESULT : IN SOME_TYPE ; PACKAGE OUTER IS VARIABLE : SOME_TYPE := FIRST_INITIAL_VALUE ; FUNCTION INNER_VARIABLE RETURN SOME_TYPE ; GENERIC INITIAL_VALUE : IN SOME_TYPE ; WITH PROCEDURE CHANGE (FIRST : IN SOME_TYPE ; RESULT : OUT SOME_TYPE) ; WITH PROCEDURE SECOND_CHANGE (FIRST : IN SOME_TYPE ; RESULT : OUT SOME_TYPE) ; FIRST_EXPECTED_RESULT : IN SOME_TYPE ; SECOND_EXPECTED_RESULT : IN SOME_TYPE ; THIRD_EXPECTED_RESULT : IN SOME_TYPE ; FOURTH_EXPECTED_RESULT : IN SOME_TYPE ; PACKAGE INNER IS VARIABLE : SOME_TYPE := INITIAL_VALUE ; END INNER ; END OUTER ; PACKAGE BODY OUTER IS ANOTHER_VARIABLE : SOME_TYPE := FIRST_INITIAL_VALUE ; PACKAGE BODY INNER IS ANOTHER_VARIABLE : SOME_TYPE := INITIAL_VALUE ; BEGIN -- INNER CHANGE (FIRST => VARIABLE, RESULT => VARIABLE) ; CHANGE (FIRST => ANOTHER_VARIABLE, RESULT => ANOTHER_VARIABLE) ; OUTER.SECOND_CHANGE (FIRST => OUTER.VARIABLE, RESULT => OUTER.VARIABLE) ; OUTER.CHANGE (FIRST => OUTER.ANOTHER_VARIABLE, RESULT => OUTER.ANOTHER_VARIABLE) ; IF (VARIABLE /= FIRST_EXPECTED_RESULT) OR (ANOTHER_VARIABLE /= SECOND_EXPECTED_RESULT) OR (OUTER.VARIABLE /= THIRD_EXPECTED_RESULT) OR (OUTER.ANOTHER_VARIABLE /= FOURTH_EXPECTED_RESULT) THEN REPORT.FAILED("ASSIGNED VALUES INCORRECT - BODY OF INNER") ; END IF; END INNER ; PACKAGE NEW_INNER IS NEW INNER (INITIAL_VALUE => SECOND_INITIAL_VALUE, CHANGE => CHANGE, SECOND_CHANGE => THIRD_CHANGE, FIRST_EXPECTED_RESULT => FIRST_EXPECTED_RESULT, SECOND_EXPECTED_RESULT => SECOND_EXPECTED_RESULT, THIRD_EXPECTED_RESULT => THIRD_EXPECTED_RESULT, FOURTH_EXPECTED_RESULT => FOURTH_EXPECTED_RESULT) ; FUNCTION INNER_VARIABLE RETURN SOME_TYPE IS BEGIN RETURN NEW_INNER.VARIABLE ; END INNER_VARIABLE ; BEGIN -- OUTER SECOND_CHANGE (FIRST => VARIABLE, RESULT => VARIABLE) ; SECOND_CHANGE (FIRST => ANOTHER_VARIABLE, RESULT => ANOTHER_VARIABLE) ; IF (VARIABLE /= FIFTH_EXPECTED_RESULT) OR (ANOTHER_VARIABLE /= SIXTH_EXPECTED_RESULT) OR (NEW_INNER.VARIABLE /= FIRST_EXPECTED_RESULT) THEN REPORT.FAILED("ASSIGNED VALUES INCORRECT - BODY OF OUTER") ; END IF; END OUTER ; PROCEDURE DOUBLE (THIS_VALUE : IN INTEGER; GIVING_THIS_RESULT : OUT INTEGER) IS BEGIN -- DOUBLE GIVING_THIS_RESULT := 2 * THIS_VALUE ; END DOUBLE ; PROCEDURE ADD_20 (TO_THIS_VALUE : IN INTEGER; GIVING_THIS_RESULT : OUT INTEGER) IS BEGIN -- ADD_20 GIVING_THIS_RESULT := TO_THIS_VALUE + 20 ; END ADD_20 ; PROCEDURE TIMES_FIVE (THIS_VALUE : IN INTEGER; GIVING_THIS_RESULT : OUT INTEGER) IS BEGIN -- TIMES_FIVE GIVING_THIS_RESULT := 5 * THIS_VALUE ; END TIMES_FIVE ; BEGIN -- CC3016C REPORT.TEST ("CC3016C" , "CHECK THAT AN INSTANCE OF A GENERIC PACKAGE " & "MUST DECLARE A PACKAGE. CHECK THAT THE STATEMENTS IN AN " & "INSTANTIATED GENERIC PACKAGE BODY ARE EXECUTED AFTER THE " & "ELABORATION OF THE DECLARATIONS (IN SPEC AND IN BODY).") ; LOCAL_BLOCK: DECLARE PACKAGE NEW_OUTER IS NEW OUTER (SOME_TYPE => INTEGER, FIRST_INITIAL_VALUE => 7, SECOND_INITIAL_VALUE => 11, CHANGE => DOUBLE, SECOND_CHANGE => ADD_20, THIRD_CHANGE => TIMES_FIVE, FIRST_EXPECTED_RESULT => 22, SECOND_EXPECTED_RESULT => 22, THIRD_EXPECTED_RESULT => 27, FOURTH_EXPECTED_RESULT => 14, FIFTH_EXPECTED_RESULT => 47, SIXTH_EXPECTED_RESULT => 34) ; BEGIN -- LOCAL_BLOCK IF (NEW_OUTER.VARIABLE /= 47) OR (NEW_OUTER.INNER_VARIABLE /= 22) THEN REPORT.FAILED("ASSIGNED VALUES INCORRECT - " & "BODY OF MAIN PROGRAM") ; END IF; END LOCAL_BLOCK ; REPORT.RESULT; END CC3016C;