WITH REPORT;
USE REPORT;
PROCEDURE C64201C IS
GLOBAL : INTEGER := 10;
TASK TYPE T IS
ENTRY E (X : IN OUT INTEGER);
END;
TYPE REC_T IS
RECORD
TT : T;
BB : BOOLEAN := TRUE;
END RECORD;
TYPE REC_REC_T IS
RECORD
RR : REC_T;
END RECORD;
TYPE ARR_T IS ARRAY (1 .. 2) OF T;
TYPE ARR_REC_T IS ARRAY (1 .. 2) OF REC_T;
RT1, RT2 : REC_T;
RRT1, RRT2 : REC_REC_T;
AT1, AT2 : ARR_T;
ART1, ART2 : ARR_REC_T;
TASK BODY T IS
BEGIN
ACCEPT E (X : IN OUT INTEGER) DO
X := X - 1;
END E;
ACCEPT E (X : IN OUT INTEGER) DO
X := X + 1;
END E;
END T;
PROCEDURE PROC1A (P1X : REC_T := RT1) IS
BEGIN
IF P1X.BB THEN FAILED( "RECORD OF TASK NOT PASSED, DEFAULT EMPLOYED" );
END IF;
END PROC1A;
PROCEDURE PROC1B (P1X : REC_T := RT1) IS
BEGIN
IF NOT P1X.BB THEN FAILED( "DEFAULT RECORD OF TASK NOT EMPLOYED" );
END IF;
END PROC1B;
PROCEDURE PROC2A (P2X : REC_REC_T := RRT1) IS
BEGIN
IF P2X.RR.BB THEN FAILED( "RECORD OF RECORD OF TASK NOT PASSED, " &
"DEFAULT EMPLOYED" );
END IF;
END PROC2A;
PROCEDURE PROC2B (P2X : REC_REC_T := RRT1) IS
BEGIN
IF NOT P2X.RR.BB THEN FAILED( "DEFAULT RECORD OF RECORD OF TASK " &
"NOT EMPLOYED" );
END IF;
END PROC2B;
PROCEDURE PROC3 (P3X : ARR_T := AT1) IS
BEGIN
P3X(1).E (X => GLOBAL); END PROC3;
PROCEDURE PROC4 (P4X : ARR_T := AT1) IS
BEGIN
P4X(1).E (X => GLOBAL); IF GLOBAL /= IDENT_INT(8) THEN
FAILED( "ARRAY OF TASKS NOT PASSED " &
"CORRECTLY IN PROC3" );
END IF;
END PROC4;
PROCEDURE PROC5 (P5X : ARR_REC_T := ART1) IS
BEGIN
P5X(1).TT.E (X => GLOBAL); END PROC5;
PROCEDURE PROC6 (P6X : ARR_REC_T := ART1) IS
BEGIN
P6X(1).TT.E (X => GLOBAL); IF GLOBAL /= IDENT_INT(8) THEN
FAILED( "ARRAY OF RECORDS OF TASKS NOT " &
"PASSED IN PROC5" );
END IF;
END PROC6;
PROCEDURE TERM (TSK : T; NUM : CHARACTER) IS
BEGIN
IF NOT TSK'TERMINATED THEN
ABORT TSK;
COMMENT ("ABORTING TASK " & NUM);
END IF;
END TERM;
BEGIN
TEST( "C64201C" , "CHECK THAT INITIALIZATION OF IN " &
"PARAMETERS OF A COMPOSITE TYPE " &
"IS PERMITTED" );
RT2.BB := FALSE;
RRT2.RR.BB := FALSE;
PROC1A(RT2); PROC1B; PROC2A(RRT2); PROC2B;
PROC3(AT2); IF GLOBAL /= 9 THEN
FAILED ("INCORRECT GLOBAL VALUE AFTER PROC3");
ELSE
PROC4; END IF;
GLOBAL := 10;
PROC5(ART2); IF GLOBAL /= 9 THEN
FAILED ("INCORRECT GLOBAL VALUE AFTER PROC5");
ELSE
PROC6; END IF;
TERM (RT1.TT, '1');
TERM (RT2.TT, '2');
TERM (RRT1.RR.TT, '3');
TERM (RRT2.RR.TT, '4');
TERM (AT1(1), '5');
TERM (AT2(1), '6');
TERM (AT1(2), '7');
TERM (AT2(2), '8');
TERM (ART1(1).TT, '9');
TERM (ART2(1).TT, 'A');
TERM (ART1(2).TT, 'B');
TERM (ART2(2).TT, 'C');
RESULT;
END C64201C;