| -- C95087A.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 UNCONSTRAINED RECORD, PRIVATE, LIMITED PRIVATE, AND ARRAY |
| -- FORMAL PARAMETERS USE THE CONSTRAINTS OF ACTUAL PARAMETERS. |
| -- SUBTESTS ARE: |
| -- (A) RECORD TYPE, UNCONSTRAINED ACTUALS, DEFAULTS. |
| -- (B) PRIVATE TYPE, CONSTRAINED ACTUALS, NO DEFAULTS. |
| -- (C) LIMITED PRIVATE TYPE, UNCONSTRAINED ACTUALS, NO DEFAULTS. |
| -- (D) ARRAY TYPE, CONSTRAINED ACTUALS, DEFAULTS. |
| |
| -- GLH 7/19/85 |
| -- JRK 8/23/85 |
| |
| WITH REPORT; USE REPORT; |
| PROCEDURE C95087A IS |
| |
| BEGIN |
| TEST ("C95087A", "CHECK USE OF ACTUAL CONSTRAINTS BY " & |
| "UNCONSTRAINED FORMAL PARAMETERS"); |
| |
| DECLARE -- (A) |
| |
| PACKAGE PKG IS |
| |
| SUBTYPE INT IS INTEGER RANGE 0..100; |
| |
| TYPE RECTYPE (CONSTRAINT : INT := 80) IS |
| RECORD |
| INTFIELD : INTEGER; |
| STRFIELD : STRING (1..CONSTRAINT); |
| END RECORD; |
| |
| REC1 : RECTYPE := (10,10,"0123456789"); |
| REC2 : RECTYPE := (17,7,"C95087A.........."); |
| REC3 : RECTYPE := (1,1,"A"); |
| REC4 : RECTYPE; -- 80. |
| |
| TASK T1 IS |
| ENTRY E1 (REC1 : IN RECTYPE := (2,0,"AB"); |
| REC2 : OUT RECTYPE; |
| REC3 : IN OUT RECTYPE); |
| END T1; |
| |
| TASK T2 IS |
| ENTRY E2 (REC : OUT RECTYPE); |
| END T2; |
| END PKG; |
| |
| PACKAGE BODY PKG IS |
| |
| TASK BODY T1 IS |
| BEGIN |
| ACCEPT E1 (REC1 : IN RECTYPE := (2,0,"AB"); |
| REC2 : OUT RECTYPE; |
| REC3 : IN OUT RECTYPE) DO |
| |
| IF REC1.CONSTRAINT /= IDENT_INT (10) THEN |
| FAILED ("RECORD TYPE IN PARAMETER " & |
| "DID NOT USE CONSTRAINT " & |
| "OF ACTUAL"); |
| END IF; |
| IF REC2.CONSTRAINT /= IDENT_INT (17) THEN |
| FAILED ("RECORD TYPE OUT " & |
| "PARAMETER DID NOT USE " & |
| "CONSTRAINT OF ACTUAL"); |
| END IF; |
| IF REC3.CONSTRAINT /= IDENT_INT (1) THEN |
| FAILED ("RECORD TYPE IN OUT " & |
| "PARAMETER DID NOT USE " & |
| "CONSTRAINT OF ACTUAL"); |
| END IF; |
| REC2 := PKG.REC2; |
| END E1; |
| END T1; |
| |
| TASK BODY T2 IS |
| BEGIN |
| ACCEPT E2 (REC : OUT RECTYPE) DO |
| IF REC.CONSTRAINT /= IDENT_INT (80) THEN |
| FAILED ("RECORD TYPE OUT " & |
| "PARAMETER DID " & |
| "NOT USE CONSTRAINT OF " & |
| "UNINITIALIZED ACTUAL"); |
| END IF; |
| REC := (10,10,"9876543210"); |
| END E2; |
| END T2; |
| END PKG; |
| |
| BEGIN -- (A) |
| |
| PKG.T1.E1 (PKG.REC1, PKG.REC2, PKG.REC3); |
| PKG.T2.E2 (PKG.REC4); |
| |
| END; -- (A) |
| |
| --------------------------------------------- |
| |
| B : DECLARE -- (B) |
| |
| PACKAGE PKG IS |
| |
| SUBTYPE INT IS INTEGER RANGE 0..100; |
| |
| TYPE RECTYPE (CONSTRAINT : INT := 80) IS PRIVATE; |
| |
| |
| TASK T1 IS |
| ENTRY E1 (REC1 : IN RECTYPE; |
| REC2 : OUT RECTYPE; |
| REC3 : IN OUT RECTYPE); |
| END T1; |
| |
| TASK T2 IS |
| ENTRY E2 (REC : OUT RECTYPE); |
| END T2; |
| |
| PRIVATE |
| TYPE RECTYPE (CONSTRAINT : INT := 80) IS |
| RECORD |
| INTFIELD : INTEGER; |
| STRFIELD : STRING (1..CONSTRAINT); |
| END RECORD; |
| END PKG; |
| |
| REC1 : PKG.RECTYPE (10); |
| REC2 : PKG.RECTYPE (17); |
| REC3 : PKG.RECTYPE (1); |
| REC4 : PKG.RECTYPE (10); |
| |
| PACKAGE BODY PKG IS |
| |
| TASK BODY T1 IS |
| BEGIN |
| ACCEPT E1 (REC1 : IN RECTYPE; |
| REC2 : OUT RECTYPE; |
| REC3 : IN OUT RECTYPE) DO |
| IF REC1.CONSTRAINT /= IDENT_INT (10) THEN |
| FAILED ("PRIVATE TYPE IN " & |
| "PARAMETER DID " & |
| "NOT USE CONSTRAINT OF " & |
| "ACTUAL"); |
| END IF; |
| IF REC2.CONSTRAINT /= IDENT_INT (17) THEN |
| FAILED ("PRIVATE TYPE OUT " & |
| "PARAMETER DID " & |
| "NOT USE CONSTRAINT OF " & |
| "ACTUAL"); |
| END IF; |
| IF REC3.CONSTRAINT /= IDENT_INT (1) THEN |
| FAILED ("PRIVATE TYPE IN OUT " & |
| "PARAMETER DID " & |
| "NOT USE CONSTRAINT OF " & |
| "ACTUAL"); |
| END IF; |
| REC2 := B.REC2; |
| END E1; |
| END T1; |
| |
| TASK BODY T2 IS |
| BEGIN |
| ACCEPT E2 (REC : OUT RECTYPE) DO |
| IF REC.CONSTRAINT /= IDENT_INT (10) THEN |
| FAILED ("PRIVATE TYPE OUT " & |
| "PARAMETER DID " & |
| "NOT USE CONSTRAINT OF " & |
| "UNINITIALIZED ACTUAL"); |
| END IF; |
| REC := (10,10,"9876543210"); |
| END E2; |
| END T2; |
| |
| BEGIN |
| REC1 := (10,10,"0123456789"); |
| REC2 := (17,7,"C95087A.........."); |
| REC3 := (1,1,"A"); |
| END PKG; |
| |
| BEGIN -- (B) |
| |
| PKG.T1.E1 (REC1, REC2, REC3); |
| PKG.T2.E2 (REC4); |
| |
| END B; -- (B) |
| |
| --------------------------------------------- |
| |
| C : DECLARE -- (C) |
| |
| PACKAGE PKG IS |
| |
| SUBTYPE INT IS INTEGER RANGE 0..100; |
| |
| TYPE RECTYPE (CONSTRAINT : INT := 80) IS |
| LIMITED PRIVATE; |
| |
| TASK T1 IS |
| ENTRY E1 (REC1 : IN RECTYPE; |
| REC2 : OUT RECTYPE; |
| REC3 : IN OUT RECTYPE); |
| END T1; |
| |
| TASK T2 IS |
| ENTRY E2 (REC : OUT RECTYPE); |
| END T2; |
| |
| PRIVATE |
| TYPE RECTYPE (CONSTRAINT : INT := 80) IS |
| RECORD |
| INTFIELD : INTEGER; |
| STRFIELD : STRING (1..CONSTRAINT); |
| END RECORD; |
| END PKG; |
| |
| REC1 : PKG.RECTYPE; -- 10. |
| REC2 : PKG.RECTYPE; -- 17. |
| REC3 : PKG.RECTYPE; -- 1. |
| REC4 : PKG.RECTYPE; -- 80. |
| |
| PACKAGE BODY PKG IS |
| |
| TASK BODY T1 IS |
| BEGIN |
| ACCEPT E1 (REC1 : IN RECTYPE; |
| REC2 : OUT RECTYPE; |
| REC3 : IN OUT RECTYPE) DO |
| IF REC1.CONSTRAINT /= IDENT_INT (10) THEN |
| FAILED ("LIMITED PRIVATE TYPE IN " & |
| "PARAMETER DID NOT USE " & |
| "CONSTRAINT OF ACTUAL"); |
| END IF; |
| IF REC2.CONSTRAINT /= IDENT_INT (17) THEN |
| FAILED ("LIMITED PRIVATE TYPE OUT " & |
| "PARAMETER DID NOT USE " & |
| "CONSTRAINT OF " & |
| "ACTUAL"); |
| END IF; |
| IF REC3.CONSTRAINT /= IDENT_INT (1) THEN |
| FAILED ("LIMITED PRIVATE TYPE IN " & |
| "OUT PARAMETER DID NOT " & |
| "USE CONSTRAINT OF ACTUAL"); |
| END IF; |
| REC2 := C.REC2; |
| END E1; |
| END T1; |
| |
| TASK BODY T2 IS |
| BEGIN |
| ACCEPT E2 (REC : OUT RECTYPE) DO |
| IF REC.CONSTRAINT /= IDENT_INT (80) THEN |
| FAILED ("LIMITED PRIVATE TYPE OUT " & |
| "PARAMETER DID NOT USE " & |
| "CONSTRAINT OF UNINITIALIZED " & |
| "ACTUAL"); |
| END IF; |
| REC := (10,10,"9876543210"); |
| END E2; |
| END T2; |
| |
| BEGIN |
| REC1 := (10,10,"0123456789"); |
| REC2 := (17,7,"C95087A.........."); |
| REC3 := (1,1,"A"); |
| END PKG; |
| |
| BEGIN -- (C) |
| |
| PKG.T1.E1 (REC1, REC2, REC3); |
| PKG.T2.E2 (REC4); |
| |
| END C; -- (C) |
| |
| --------------------------------------------- |
| |
| D : DECLARE -- (D) |
| |
| TYPE ATYPE IS ARRAY (INTEGER RANGE <>, POSITIVE RANGE <>) OF |
| CHARACTER; |
| |
| A1, A2, A3 : ATYPE (-1..1, 4..5) := (('A','B'), |
| ('C','D'), |
| ('E','F')); |
| |
| A4 : ATYPE (-1..1, 4..5); |
| |
| CA1 : CONSTANT ATYPE (8..9, -7..INTEGER'FIRST) := |
| (8..9 => (-7..INTEGER'FIRST => 'A')); |
| |
| S1 : STRING (1..INTEGER'FIRST) := ""; |
| S2 : STRING (-5..-7) := ""; |
| S3 : STRING (1..0) := ""; |
| |
| TASK T1 IS |
| ENTRY E1 (A1 : IN ATYPE := CA1; |
| A2 : OUT ATYPE; |
| A3 : IN OUT ATYPE); |
| END T1; |
| |
| TASK T2 IS |
| ENTRY E2 (A4 : OUT ATYPE); |
| END T2; |
| |
| TASK T3 IS |
| ENTRY E3 (S1 : IN STRING; |
| S2 : IN OUT STRING; |
| S3 : OUT STRING); |
| END T3; |
| |
| TASK BODY T1 IS |
| BEGIN |
| ACCEPT E1 (A1 : IN ATYPE := CA1; A2 : OUT ATYPE; |
| A3 : IN OUT ATYPE) DO |
| IF A1'FIRST(1) /= IDENT_INT (-1) OR |
| A1'LAST(1) /= IDENT_INT (1) OR |
| A1'FIRST(2) /= IDENT_INT (4) OR |
| A1'LAST(2) /= IDENT_INT (5) THEN |
| FAILED ("ARRAY TYPE IN PARAMETER DID " & |
| "NOT USE CONSTRAINTS OF ACTUAL"); |
| END IF; |
| IF A2'FIRST(1) /= IDENT_INT (-1) OR |
| A2'LAST(1) /= IDENT_INT (1) OR |
| A2'FIRST(2) /= IDENT_INT (4) OR |
| A2'LAST(2) /= IDENT_INT (5) THEN |
| FAILED ("ARRAY TYPE OUT PARAMETER DID " & |
| "NOT USE CONSTRAINTS OF ACTUAL"); |
| END IF; |
| IF A3'FIRST(1) /= IDENT_INT (-1) OR |
| A3'LAST(1) /= IDENT_INT (1) OR |
| A3'FIRST(2) /= IDENT_INT (4) OR |
| A3'LAST(2) /= IDENT_INT (5) THEN |
| FAILED ("ARRAY TYPE IN OUT PARAMETER " & |
| "DID NOT USE CONSTRAINTS OF " & |
| "ACTUAL"); |
| END IF; |
| A2 := D.A2; |
| END E1; |
| END T1; |
| |
| TASK BODY T2 IS |
| BEGIN |
| ACCEPT E2 (A4 : OUT ATYPE) DO |
| IF A4'FIRST(1) /= IDENT_INT (-1) OR |
| A4'LAST(1) /= IDENT_INT (1) OR |
| A4'FIRST(2) /= IDENT_INT (4) OR |
| A4'LAST(2) /= IDENT_INT (5) THEN |
| FAILED ("ARRAY TYPE OUT PARAMETER DID " & |
| "NOT USE CONSTRAINTS OF " & |
| "UNINITIALIZED ACTUAL"); |
| END IF; |
| A4 := A2; |
| END E2; |
| END T2; |
| |
| TASK BODY T3 IS |
| BEGIN |
| ACCEPT E3 (S1 : IN STRING; |
| S2 : IN OUT STRING; |
| S3 : OUT STRING) DO |
| IF S1'FIRST /= IDENT_INT (1) OR |
| S1'LAST /= IDENT_INT (INTEGER'FIRST) THEN |
| FAILED ("STRING TYPE IN PARAMETER DID " & |
| "NOT USE CONSTRAINTS OF ACTUAL " & |
| "NULL STRING"); |
| END IF; |
| IF S2'FIRST /= IDENT_INT (-5) OR |
| S2'LAST /= IDENT_INT (-7) THEN |
| FAILED ("STRING TYPE IN OUT PARAMETER " & |
| "DID NOT USE CONSTRAINTS OF " & |
| "ACTUAL NULL STRING"); |
| END IF; |
| IF S3'FIRST /= IDENT_INT (1) OR |
| S3'LAST /= IDENT_INT (0) THEN |
| FAILED ("STRING TYPE OUT PARAMETER DID NOT " & |
| "USE CONSTRAINTS OF ACTUAL NULL " & |
| "STRING"); |
| END IF; |
| S3 := ""; |
| END E3; |
| END T3; |
| |
| BEGIN -- (D) |
| |
| T1.E1 (A1, A2, A3); |
| T2.E2 (A4); |
| T3.E3 (S1, S2, S3); |
| |
| END D; -- (D) |
| |
| RESULT; |
| END C95087A; |