-- C37208A.ADA (RA #534/1) -- 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. --* -- FOR A TYPE WITH DEFAULT DISCRIMINANT VALUES, CHECK THAT A -- DISCRIMINANT CONSTRAINT CAN BE OMITTED IN: -- AN OBJECT DECLARATION, AND HENCE ASSIGNMENTS TO THE OBJECT CAN -- CHANGE ITS DISCRIMINANTS; -- A COMPONENT_DECLARATION IN A RECORD TYPE DEFINITION, AND HENCE -- ASSIGNMENTS TO THE COMPONENT CAN CHANGE THE VALUE OF ITS -- DISCRIMINANTS; -- A SUBTYPE INDICATION IN AN ARRAY TYPE DEFINITION, AND HENCE -- ASSIGNMENTS TO ONE OF THE COMPONENTS CAN CHANGE ITS -- DISCRIMINANT VALUES; -- A FORMAL PARAMETER OF A SUBPROGRAM; EXCEPT FOR PARAMETERS OF -- MODE IN, THE 'CONSTRAINED ATTRIBUTE OF THE ACTUAL PARAMETER -- BECOMES THE 'CONSTRAINED ATTRIBUTE OF THE FORMAL PARAMETER; -- FOR IN OUT AND OUT PARAMETERS, IF THE 'CONSTRAINED ATTRIBUTE IS -- FALSE, ASSIGNMENTS TO THE FORMAL PARAMETER CAN CHANGE THE -- DISCRIMINANTS OF THE ACTUAL PARAMETER; IF THE 'CONSTRAINED -- ATTRIBUTE IS TRUE, ASSIGNNMENTS THAT ATTEMPT TO CHANGE THE -- DISCRIMINANTS OF THE ACTUAL PARAMETER RAISE CONSTRAINT_ERROR. -- ASL 7/23/81 -- EDS 7/16/98 AVOID OPTIMIZATION WITH REPORT; PROCEDURE C37208A IS USE REPORT; BEGIN TEST ("C37208A","DISCRIMINANT CONSTRAINT CAN BE OMITTED " & "FROM OBJECT DECLARATION, COMPONENT DECLARATION, SUBTYPE " & "INDICATION OR FORMAL SUBPROGRAM PARAMETER, IF THE TYPE " & "HAS DEFAULT DISCRIMINANTS"); DECLARE TYPE REC1(DISC : INTEGER := 7) IS RECORD NULL; END RECORD; TYPE REC2 IS RECORD COMP : REC1; END RECORD; R : REC2; U1,U2,U3 : REC1 := (DISC => 3); C1,C2,C3 : REC1(3) := (DISC => 3); ARR : ARRAY(INTEGER RANGE 1..10) OF REC1; ARR2 : ARRAY (1..10) OF REC1(4); PROCEDURE PROC(P_IN : IN REC1; P_OUT : OUT REC1; P_IN_OUT : IN OUT REC1; CONSTR : IN BOOLEAN) IS BEGIN IF P_OUT'CONSTRAINED /= CONSTR OR P_IN_OUT'CONSTRAINED /= CONSTR THEN FAILED ("CONSTRAINED ATTRIBUTES DO NOT MATCH " & "FOR ACTUAL AND FORMAL PARAMETERS"); END IF; IF P_IN'CONSTRAINED /= IDENT_BOOL(TRUE) THEN FAILED ("'CONSTRAINED IS FALSE FOR IN " & "PARAMETER"); END IF; IF NOT CONSTR THEN -- UNCONSTRAINED ACTUAL PARAM P_OUT := (DISC => IDENT_INT(0)); P_IN_OUT := (DISC => IDENT_INT(0)); ELSE BEGIN P_OUT := (DISC => IDENT_INT(0)); FAILED ("DISCRIMINANT OF CONSTRAINED ACTUAL " & "PARAMETER ILLEGALLY CHANGED - 1"); EXCEPTION WHEN CONSTRAINT_ERROR => NULL; WHEN OTHERS => FAILED ("WRONG EXCEPTION - 1"); END; BEGIN P_IN_OUT := (DISC => IDENT_INT(0)); FAILED ("DISCRIMINANT OF CONSTRAINED ACTUAL " & "PARAMETER ILLEGALLY CHANGED - 2"); EXCEPTION WHEN CONSTRAINT_ERROR => NULL; WHEN OTHERS => FAILED ("WRONG EXCEPTION - 2"); END; END IF; END PROC; BEGIN IF U1.DISC /= IDENT_INT(3) THEN FAILED ("INITIAL DISCRIMINANT VALUE WRONG - U1"); END IF; U1 := (DISC => IDENT_INT(5)); IF U1.DISC /= 5 THEN FAILED ("ASSIGNMENT FAILED FOR OBJECT"); END IF; IF R.COMP.DISC /= IDENT_INT(7) THEN FAILED ("DEFAULT DISCRIMINANT VALUE WRONG - R"); END IF; R.COMP := (DISC => IDENT_INT(5)); IF R.COMP.DISC /= 5 THEN FAILED ("ASSIGNMENT FAILED FOR RECORD COMPONENT"); END IF; FOR I IN 1..10 LOOP IF ARR(I).DISC /= IDENT_INT(7) THEN FAILED ("DEFAULT DISCRIMINANT VALUE WRONG - ARR"); END IF; END LOOP; ARR(3) := (DISC => IDENT_INT(5)); IF ARR(3).DISC /= 5 THEN FAILED ("ASSIGNMENT FAILED FOR ARRAY COMPONENT"); END IF; IF ARR /= (1..2|4..10 => (DISC => 7), 3 => (DISC => 5)) THEN FAILED ("MODIFIED WRONG COMPONENTS"); END IF; PROC(C1,C2,C3,IDENT_BOOL(TRUE)); PROC(U1,U2,U3,IDENT_BOOL(FALSE)); IF U2.DISC /= 0 OR U3.DISC /= 0 THEN FAILED ("ASSIGNMENT TO UNCONSTRAINED ACTUAL PARAMETER " & "FAILED TO CHANGE DISCRIMINANT"); END IF; PROC(ARR(1), ARR(3), ARR(4), FALSE); IF ARR(3).DISC /= 0 OR ARR(4).DISC /= 0 THEN FAILED ("ARRAY COMPONENT ASSIGNMENTS DIDN'T CHANGE " & "DISCRIMINANT OF COMPONENT"); END IF; PROC (ARR2(2), ARR2(5), ARR2(10), TRUE); END; RESULT; END C37208A;