WITH REPORT; USE REPORT;
PROCEDURE CC3120B IS
BEGIN
TEST ("CC3120B", "TASKS ARE NOT COPIED AS GENERIC PARAMETERS");
DECLARE
PACKAGE P IS
TYPE T IS LIMITED PRIVATE;
PROCEDURE UPDT (TPARM: IN T; I : IN OUT INTEGER);
PRIVATE
TASK TYPE T1 IS
ENTRY GET (I : OUT INTEGER);
ENTRY PUT (I : IN INTEGER);
END T1;
TYPE T IS RECORD
C : T1;
END RECORD;
END P;
USE P;
TT : T;
GENERIC
TYPE T IS LIMITED PRIVATE;
T1 : IN OUT T;
WITH PROCEDURE UPDT (TPARM : IN T; I: IN OUT INTEGER)
IS <> ;
PROCEDURE PR;
PROCEDURE PR IS
I : INTEGER;
BEGIN
I := 5;
UPDT (T1, I);
IF I /= 4 THEN
FAILED ("BAD VALUE 1");
END IF;
I := 6;
UPDT (T1, I);
IF I /= 5 THEN
FAILED ("BAD VALUE 3");
END IF;
RAISE TASKING_ERROR;
FAILED ("INCORRECT RAISE STATEMENT");
END PR;
PACKAGE BODY P IS
PROCEDURE UPDT (TPARM : IN T; I : IN OUT INTEGER) IS
V : INTEGER := I;
BEGIN
TPARM.C.GET (I);
TPARM.C.PUT (V);
END UPDT;
TASK BODY T1 IS
I : INTEGER;
BEGIN
I := 1;
LOOP
SELECT
ACCEPT GET (I : OUT INTEGER) DO
I := T1.I;
END GET;
OR
ACCEPT PUT (I : IN INTEGER) DO
T1.I := I;
END PUT;
OR
TERMINATE;
END SELECT;
END LOOP;
END T1;
END P;
BEGIN
DECLARE
X : INTEGER := 2;
PROCEDURE PPP IS NEW PR (T, TT);
BEGIN
UPDT (TT, X);
X := X + 3;
UPDT (TT, X);
IF X /= 2 THEN
FAILED ("WRONG VALUE FOR X");
END IF;
BEGIN
PPP;
FAILED ("PPP NOT CALLED");
EXCEPTION
WHEN TASKING_ERROR => NULL;
END;
X := 12;
UPDT (TT, X);
IF X /= 6 THEN
FAILED ("WRONG FINAL VALUE IN TASK");
END IF;
END;
END;
RESULT;
END CC3120B;