| -- CC3017C.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. |
| --* |
| -- OBJECTIVE: |
| -- CHECK THAT AN INSTANCE OF A GENERIC PROCEDURE MUST DECLARE A |
| -- PROCEDURE AND THAT AN INSTANCE OF A GENERIC FUNCTION MUST |
| -- DECLARE A FUNCTION. CHECK THAT SCALAR AND ACCESS PARAMETERS |
| -- ARE COPIED. |
| -- |
| -- SUBTESTS ARE: |
| -- (A) SCALAR PARAMETERS TO PROCEDURES. |
| -- (B) SCALAR PARAMETERS TO FUNCTIONS. |
| -- (C) ACCESS PARAMETERS TO PROCEDURES. |
| -- (D) ACCESS PARAMETERS TO FUNCTIONS. |
| |
| -- HISTORY: |
| -- EDWARD V. BERARD, 7 AUGUST 1990 |
| -- CJJ 10/16/90 ADJUSTED LINES THAT WERE TOO LONG; REFORMATTED |
| -- HEADER TO CONFORM TO ACVC STANDARDS. |
| -- |
| |
| WITH REPORT; |
| PROCEDURE CC3017C IS |
| |
| BEGIN |
| REPORT.TEST ("CC3017C", "CHECK THAT AN INSTANCE OF A GENERIC " & |
| "PROCEDURE MUST DECLARE A PROCEDURE AND THAT AN " & |
| "INSTANCE OF A GENERIC FUNCTION MUST DECLARE A " & |
| "FUNCTION. CHECK THAT SCALAR AND ACCESS PARAMETERS " & |
| "ARE COPIED"); |
| |
| -------------------------------------------------- |
| |
| SCALAR_TO_PROCS: |
| |
| DECLARE |
| |
| -- (A) SCALAR PARAMETERS TO PROCEDURES. |
| |
| TYPE NUMBER IS RANGE 0 .. 120 ; |
| VALUE : NUMBER ; |
| E : EXCEPTION ; |
| |
| GENERIC |
| |
| TYPE SCALAR_ITEM IS RANGE <> ; |
| |
| PROCEDURE P (P_IN : IN SCALAR_ITEM ; |
| P_OUT : OUT SCALAR_ITEM ; |
| P_IN_OUT : IN OUT SCALAR_ITEM) ; |
| |
| PROCEDURE P (P_IN : IN SCALAR_ITEM ; |
| P_OUT : OUT SCALAR_ITEM ; |
| P_IN_OUT : IN OUT SCALAR_ITEM) IS |
| |
| STORE : SCALAR_ITEM ; |
| |
| BEGIN -- P |
| |
| STORE := P_IN; -- SAVE VALUE OF P_IN AT PROC ENTRY. |
| |
| P_OUT := 10; |
| IF (P_IN /= STORE) THEN |
| REPORT.FAILED ("ASSIGNMENT TO SCALAR OUT " & |
| "PARAMETER CHANGES THE VALUE OF " & |
| "INPUT PARAMETER"); |
| STORE := P_IN; -- RESET STORE FOR NEXT CASE. |
| END IF; |
| |
| P_IN_OUT := P_IN_OUT + 100; |
| IF (P_IN /= STORE) THEN |
| REPORT.FAILED ("ASSIGNMENT TO SCALAR IN OUT " & |
| "PARAMETER CHANGES THE VALUE OF " & |
| "INPUT PARAMETER"); |
| STORE := P_IN; -- RESET STORE FOR NEXT CASE. |
| END IF; |
| |
| VALUE := VALUE + 1; |
| IF (P_IN /= STORE) THEN |
| REPORT.FAILED ("ASSIGNMENT TO SCALAR GLOBAL " & |
| "PARAMETER CHANGES THE VALUE OF " & |
| "INPUT PARAMETER"); |
| END IF; |
| |
| RAISE E; -- CHECK EXCEPTION HANDLING. |
| END P; |
| |
| PROCEDURE NEW_P IS NEW P (SCALAR_ITEM => NUMBER) ; |
| |
| BEGIN -- SCALAR_TO_PROCS |
| VALUE := 0; -- INITIALIZE VALUE SO VARIOUS CASES CAN BE DETECTED. |
| |
| NEW_P (P_IN => VALUE, |
| P_OUT => VALUE, |
| P_IN_OUT => VALUE); |
| |
| REPORT.FAILED ("EXCEPTION NOT RAISED - SCALARS TO PROCEDURES"); |
| EXCEPTION |
| WHEN E => |
| IF (VALUE /= 1) THEN |
| CASE VALUE IS |
| WHEN 11 => |
| REPORT.FAILED ("OUT ACTUAL SCALAR " & |
| "PARAMETER CHANGED GLOBAL VALUE"); |
| WHEN 101 => |
| REPORT.FAILED ("IN OUT ACTUAL SCALAR " & |
| "PARAMETER CHANGED GLOBAL VALUE"); |
| WHEN 111 => |
| REPORT.FAILED ("OUT AND IN OUT ACTUAL " & |
| "SCALAR PARAMETERS CHANGED " & |
| "GLOBAL VALUE"); |
| WHEN OTHERS => |
| REPORT.FAILED ("UNDETERMINED CHANGE TO " & |
| "GLOBAL VALUE"); |
| END CASE; |
| END IF; |
| WHEN OTHERS => |
| REPORT.FAILED ("WRONG EXCEPTION RAISED - SCALARS TO PROCEDURES"); |
| END SCALAR_TO_PROCS ; |
| |
| -------------------------------------------------- |
| |
| SCALAR_TO_FUNCS: |
| |
| DECLARE |
| |
| -- (B) SCALAR PARAMETERS TO FUNCTIONS. |
| |
| TYPE NUMBER IS RANGE 0 .. 101 ; |
| FIRST : NUMBER ; |
| SECOND : NUMBER ; |
| |
| GENERIC |
| |
| TYPE ITEM IS RANGE <> ; |
| |
| FUNCTION F (F_IN : IN ITEM) RETURN ITEM ; |
| |
| FUNCTION F (F_IN : IN ITEM) RETURN ITEM IS |
| |
| STORE : ITEM := F_IN; |
| |
| BEGIN -- F |
| |
| FIRST := FIRST + 1; |
| IF (F_IN /= STORE) THEN |
| REPORT.FAILED ("ASSIGNMENT TO SCALAR GLOBAL FUNCTION " & |
| "PARAMETER CHANGES THE VALUE OF " & |
| "INPUT PARAMETER"); |
| END IF; |
| |
| RETURN (100); |
| END F; |
| |
| FUNCTION NEW_F IS NEW F (ITEM => NUMBER) ; |
| |
| BEGIN -- SCALAR_TO_FUNCS |
| FIRST := 100 ; |
| SECOND := NEW_F (FIRST) ; |
| END SCALAR_TO_FUNCS ; |
| |
| -------------------------------------------------- |
| |
| ACCESS_TO_PROCS: |
| |
| DECLARE |
| |
| -- (C) ACCESS PARAMETERS TO PROCEDURES. |
| |
| 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 ; |
| DATE_POINTER : DATE_ACCESS ; |
| |
| E : EXCEPTION; |
| |
| GENERIC |
| |
| TYPE ITEM IS PRIVATE ; |
| TYPE ACCESS_ITEM IS ACCESS ITEM ; |
| |
| PROCEDURE P (P_IN : IN ACCESS_ITEM ; |
| P_OUT : OUT ACCESS_ITEM ; |
| P_IN_OUT : IN OUT ACCESS_ITEM) ; |
| |
| PROCEDURE P (P_IN : IN ACCESS_ITEM ; |
| P_OUT : OUT ACCESS_ITEM ; |
| P_IN_OUT : IN OUT ACCESS_ITEM) IS |
| |
| STORE : ACCESS_ITEM ; |
| |
| BEGIN -- P |
| |
| STORE := P_IN ; -- SAVE VALUE OF P_IN AT PROC ENTRY. |
| |
| DATE_POINTER := NEW DATE'(YEAR => 1990, |
| DAY => 7, |
| MONTH => AUG) ; |
| IF (P_IN /= STORE) THEN |
| REPORT.FAILED ("ASSIGNMENT TO ACCESS GLOBAL " & |
| "PARAMETER CHANGES THE VALUE OF " & |
| "INPUT PARAMETER"); |
| STORE := P_IN; -- RESET STORE FOR NEXT CASE. |
| END IF; |
| |
| P_OUT := NEW ITEM ; |
| IF (P_IN /= STORE) THEN |
| REPORT.FAILED ("ASSIGNMENT TO ACCESS OUT " & |
| "PARAMETER CHANGES THE VALUE OF " & |
| "INPUT PARAMETER"); |
| STORE := P_IN; -- RESET STORE FOR NEXT CASE. |
| END IF; |
| |
| P_IN_OUT := NEW ITEM ; |
| IF (P_IN /= STORE) THEN |
| REPORT.FAILED ("ASSIGNMENT TO ACCESS IN OUT " & |
| "PARAMETER CHANGES THE VALUE OF " & |
| "INPUT PARAMETER"); |
| END IF; |
| |
| RAISE E; -- CHECK EXCEPTION HANDLING. |
| END P ; |
| |
| PROCEDURE NEW_P IS NEW P (ITEM => DATE, |
| ACCESS_ITEM => DATE_ACCESS) ; |
| |
| BEGIN -- ACCESS_TO_PROCS |
| DATE_POINTER := NEW DATE'(MONTH => DEC, |
| DAY => 25, |
| YEAR => 2000) ; |
| |
| NEW_P (P_IN => DATE_POINTER, |
| P_OUT => DATE_POINTER, |
| P_IN_OUT => DATE_POINTER) ; |
| |
| REPORT.FAILED ("EXCEPTION NOT RAISED - ACCESS TO PROCEDURES"); |
| EXCEPTION |
| WHEN E => |
| IF (DATE_POINTER.ALL /= (AUG, 7, 1990)) THEN |
| REPORT.FAILED ("OUT OR IN OUT ACTUAL PROCEDURE " & |
| "PARAMETER VALUE CHANGED DESPITE " & |
| "RAISED EXCEPTION"); |
| END IF; |
| WHEN OTHERS => |
| REPORT.FAILED ("WRONG EXCEPTION RAISED - ACCESS TO PROCEDURES"); |
| END ACCESS_TO_PROCS ; |
| |
| -------------------------------------------------- |
| |
| ACCESS_TO_FUNCS: |
| |
| DECLARE |
| |
| -- (D) ACCESS PARAMETERS TO FUNCTIONS. |
| |
| 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 ; |
| DATE_POINTER : DATE_ACCESS ; |
| NEXT_DATE : DATE_ACCESS ; |
| |
| GENERIC |
| |
| TYPE ITEM IS PRIVATE ; |
| TYPE ACCESS_ITEM IS ACCESS ITEM ; |
| |
| FUNCTION F (F_IN : IN ACCESS_ITEM) RETURN ACCESS_ITEM ; |
| |
| FUNCTION F (F_IN : IN ACCESS_ITEM) RETURN ACCESS_ITEM IS |
| |
| STORE : ACCESS_ITEM := F_IN ; |
| |
| BEGIN -- F |
| |
| DATE_POINTER := NEW DATE'(YEAR => 1990, |
| DAY => 7, |
| MONTH => AUG) ; |
| IF (F_IN /= STORE) THEN |
| REPORT.FAILED ("ASSIGNMENT TO ACCESS GLOBAL FUNCTION " & |
| "PARAMETER CHANGES THE VALUE OF " & |
| "INPUT PARAMETER"); |
| END IF; |
| |
| RETURN (NULL); |
| END F ; |
| |
| FUNCTION NEW_F IS NEW F (ITEM => DATE, |
| ACCESS_ITEM => DATE_ACCESS) ; |
| |
| BEGIN -- ACCESS_TO_FUNCS |
| DATE_POINTER := NULL ; |
| NEXT_DATE := NEW_F(F_IN => DATE_POINTER) ; |
| END ACCESS_TO_FUNCS ; |
| |
| -------------------------------------------------- |
| |
| REPORT.RESULT; |
| |
| END CC3017C; |