-- C45112B.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 BOUNDS OF THE RESULT OF A LOGICAL ARRAY OPERATION 
-- ARE THE BOUNDS OF THE LEFT OPERAND WHEN THE OPERANDS ARE NULL 
-- ARRAYS.

-- RJW 2/3/86

WITH REPORT; USE REPORT;

PROCEDURE C45112B IS 
     
     TYPE ARR IS ARRAY(INTEGER RANGE <>) OF BOOLEAN;
     A1 : ARR(IDENT_INT(4) .. IDENT_INT(3));
     A2 : ARR(IDENT_INT(2) .. IDENT_INT(1));
     SUBTYPE CARR IS ARR (IDENT_INT (A1'FIRST) .. IDENT_INT (A1'LAST));

     PROCEDURE CHECK (X : ARR; N1, N2 : STRING) IS
     BEGIN
          IF X'FIRST /= A1'FIRST OR X'LAST /= A1'LAST THEN
               FAILED ( "WRONG BOUNDS FOR " & N1 & " FOR " & N2 );
          END IF;
     END CHECK;
     
BEGIN

     TEST ( "C45112B", "CHECK THE BOUNDS OF THE RESULT OF LOGICAL " &
                       "ARRAY OPERATIONS ON NULL ARRAYS" );

     BEGIN
          DECLARE
               AAND : CONSTANT ARR := A1 AND A2;
               AOR  : CONSTANT ARR := A1 OR A2;
               AXOR : CONSTANT ARR := A1 XOR A2;          
          BEGIN
               CHECK (AAND, "INITIALIZATION OF CONSTANT ARRAY ", 
                            "'AND'" );

               CHECK (AOR, "INITIALIZATION OF CONSTANT ARRAY ", 
                            "'OR'" );
     
               CHECK (AXOR, "INITIALIZATION OF CONSTANT ARRAY ", 
                            "'XOR'" );
          END;
     EXCEPTION
          WHEN CONSTRAINT_ERROR =>
               FAILED ( "CONSTRAINT_ERROR RAISED DURING " &
                        "INTIALIZATIONS" );
          WHEN OTHERS =>
               FAILED ( "OTHER EXCEPTION RAISED DURING " &
                        "INITIALIZATIONS" );
     END;
                              
     DECLARE
          PROCEDURE PROC (A : ARR; STR : STRING) IS
          BEGIN
               CHECK (A, "FORMAL PARAMETER FOR CONSTRAINED ARRAY", 
                      STR);
          END PROC;
     BEGIN
          PROC ((A1 AND A2), "'AND'" );
          PROC ((A1 OR A2), "'OR'" );
          PROC ((A1 XOR A2), "'XOR'" );
     EXCEPTION
          WHEN OTHERS =>
               FAILED ( "EXCEPTION RAISED DURING TEST FOR FORMAL " &
                        "PARAMETERS" );
     END;

     DECLARE
          FUNCTION FUNCAND RETURN ARR IS
          BEGIN
               RETURN A1 AND A2;
          END FUNCAND;

          FUNCTION FUNCOR RETURN ARR IS
          BEGIN
               RETURN A1 OR A2;
          END FUNCOR;
     
          FUNCTION FUNCXOR RETURN ARR IS
          BEGIN
               RETURN A1 XOR A2;
          END FUNCXOR;

     BEGIN
          CHECK (FUNCAND, "RETURN STATEMENT", "'AND'");
          CHECK (FUNCOR, "RETURN STATEMENT", "'OR'");
          CHECK (FUNCXOR, "RETURN STATEMENT", "'XOR'");
     
     EXCEPTION
          WHEN OTHERS =>
               FAILED ( "EXCEPTION RAISED DURING TEST FOR RETURN " &
                        "FROM FUNCTION" );
     END;

     BEGIN
          DECLARE
               GENERIC
                   X : IN ARR;
               PACKAGE PKG IS 
                    FUNCTION G RETURN ARR;
               END PKG;
     
               PACKAGE BODY PKG IS
                    FUNCTION G RETURN ARR IS
                    BEGIN
                         RETURN X;
                    END G;
               END PKG;
                         
               PACKAGE PAND IS NEW PKG(X => A1 AND A2);
               PACKAGE POR IS NEW PKG(X => A1 OR A2);
               PACKAGE PXOR IS NEW PKG(X => A1 XOR A2);
          BEGIN
               CHECK (PAND.G, "GENERIC FORMAL PARAMETER", "'AND'");
               CHECK (POR.G, "GENERIC FORMAL PARAMETER", "'OR'");
               CHECK (PXOR.G, "GENERIC FORMAL PARAMMETER", "'XOR'");
          END;
     EXCEPTION
          WHEN OTHERS =>
               FAILED ( "EXCEPTION RAISED DURING GENERIC " &
                        "INSTANTIATION" );
     END;

     DECLARE
          TYPE ACC IS ACCESS ARR;
          AC : ACC;
               
     BEGIN
          AC :=  NEW ARR'(A1 AND A2);
          CHECK (AC.ALL, "ALLOCATION", "'AND'");
          AC :=  NEW ARR'(A1 OR A2);
          CHECK (AC.ALL, "ALLOCATION", "'OR'");
          AC :=  NEW ARR'(A1 XOR A2);
          CHECK (AC.ALL, "ALLOCATION", "'XOR'");
     EXCEPTION
          WHEN OTHERS => 
               FAILED ( "EXCEPTION RAISED ON ALLOCATION" );
     END;

     BEGIN
          CHECK (CARR' (A1 AND A2), "QUALIFIED EXPRESSION", "'AND'");
          CHECK (CARR' (A1 OR A2), "QUALIFIED EXPRESSION", "'OR'");
          CHECK (CARR' (A1 XOR A2), "QUALIFIED EXPRESSION", "'XOR'");
     EXCEPTION
          WHEN OTHERS => 
               FAILED ( "EXCEPTION RAISED ON QUALIFIED EXPRESSION" );
     END;
               
     DECLARE
          TYPE REC IS
               RECORD
                    RCA : CARR;
               END RECORD;
          R1 : REC;

     BEGIN
          R1 := (RCA => (A1 AND A2));
          CHECK (R1.RCA, "AGGREGATE", "'AND'");
          R1 := (RCA => (A1 OR A2));
          CHECK (R1.RCA, "AGGREGATE", "'OR'");
          R1 := (RCA => (A1 XOR A2));
          CHECK (R1.RCA, "AGGREGATE", "'XOR'");
     EXCEPTION
          WHEN OTHERS => 
               FAILED ( "EXCEPTION RAISED ON AGGREGATE" );
     END;
                    
     BEGIN
          DECLARE
               TYPE RECDEF IS
                    RECORD
                         RCDF1 : CARR := A1 AND A2;
                         RCDF2 : CARR := A1 OR A2;
                         RCDF3 : CARR := A1 XOR A2;
                    END RECORD;
               RD : RECDEF;
          BEGIN
               CHECK (RD.RCDF1, "DEFAULT RECORD", "'AND'");
               CHECK (RD.RCDF2, "DEFAULT RECORD", "'OR'");
               CHECK (RD.RCDF3, "DEFAULT RECORD", "'XOR'");
          EXCEPTION
               WHEN OTHERS => 
                    FAILED ( "EXCEPTION RAISED ON DEFAULT RECORD" );
          END;
     EXCEPTION
          WHEN OTHERS =>
               FAILED ( "EXCEPTION RAISED DURING INITIALIZATION OF " &
                        "DEFAULT RECORD" );
     END;
               
     DECLARE 
          PROCEDURE PDEF (X : CARR := A1 AND A2; 
                          Y : CARR := A1 OR A2; 
                          Z : CARR := A1 XOR A2 ) IS
          BEGIN
               CHECK (X, "DEFAULT PARAMETER", "'AND'");
               CHECK (Y, "DEFAULT PARAMETER", "'OR'");
               CHECK (Z, "DEFAULT PARAMETER", "'XOR'");
          END PDEF;
     
     BEGIN
          PDEF;
     EXCEPTION
          WHEN OTHERS => 
               FAILED ( "EXCEPTION RAISED ON DEFAULT PARM" );
     END;

     RESULT;

END C45112B;
