aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/ada/acats/tests/c9/c974002.a
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.9/gcc/testsuite/ada/acats/tests/c9/c974002.a')
-rw-r--r--gcc-4.9/gcc/testsuite/ada/acats/tests/c9/c974002.a209
1 files changed, 209 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/ada/acats/tests/c9/c974002.a b/gcc-4.9/gcc/testsuite/ada/acats/tests/c9/c974002.a
new file mode 100644
index 000000000..1138e8da3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/ada/acats/tests/c9/c974002.a
@@ -0,0 +1,209 @@
+-- C974002.A
+--
+-- 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.
+--*
+--
+-- OBJECTIVE:
+-- Check that the sequence of statements of the triggering alternative
+-- of an asynchronous select statement is executed if the triggering
+-- statement is a delay_until statement, and the specified time has
+-- already passed. Check that the abortable part is not executed after
+-- the sequence of statements of the triggering alternative is left.
+--
+-- Check that the sequence of statements of the triggering alternative
+-- of an asynchronous select statement is not executed if the abortable
+-- part completes before the triggering statement, and the triggering
+-- statement is a delay_until statement.
+--
+-- TEST DESCRIPTION:
+-- Declare a task with an accept statement containing an asynchronous
+-- select with a delay_until triggering statement. Parameterize
+-- the accept statement with the time to be used in the delay. Simulate
+-- a quick calculation by declaring a procedure which sets a Boolean
+-- flag. Call this procedure in the abortable part.
+--
+-- Make two calls to the task entry: (1) with a time that has already
+-- expired, and (2) with a time that will not expire before the quick
+-- calculation completes.
+--
+-- For (1), the sequence of statements following the triggering statement
+-- is executed, and the abortable part never starts.
+--
+-- For (2), the abortable part completes before the triggering statement,
+-- the delay is canceled, and the sequence of statements following the
+-- triggering statement never starts.
+--
+--
+-- CHANGE HISTORY:
+-- 06 Dec 94 SAIC ACVC 2.0
+-- 26 Nov 95 SAIC Bug fix for ACVC 2.0.1.
+--
+--!
+
+with Report;
+with Ada.Calendar;
+with ImpDef;
+procedure C974002 is
+
+ function "-" (Left: Ada.Calendar.Time; Right: Duration )
+ return Ada.Calendar.Time renames Ada.Calendar."-";
+ function "+" (Left: Ada.Calendar.Time; Right: Duration )
+ return Ada.Calendar.Time renames Ada.Calendar."+";
+
+ Abortable_Part_Executed : Boolean;
+ Triggering_Alternative_Executed : Boolean;
+
+
+ --========================================================--
+
+
+ procedure Quick_Calculation is
+ begin
+ if Report.Equal (1, 1) then
+ Abortable_Part_Executed := True;
+ end if;
+ end Quick_Calculation;
+
+
+ --========================================================--
+
+
+ task type Timed_Calculation_Task is
+ entry Calculation (Time_Out : in Ada.Calendar.Time);
+ end Timed_Calculation_Task;
+
+
+ task body Timed_Calculation_Task is
+ begin
+ loop
+ select
+ accept Calculation (Time_Out : in Ada.Calendar.Time) do
+
+ -- --
+ -- Asynchronous select is tested here --
+ -- --
+
+ select
+ delay until Time_Out; -- Triggering
+ -- statement.
+
+ Triggering_Alternative_Executed := True; -- Triggering
+ -- alternative.
+ then abort
+ Quick_Calculation; -- Abortable part.
+ end select;
+ end Calculation;
+ or
+ terminate;
+ end select;
+ end loop;
+ exception
+ when others =>
+ Report.Failed ("Unexpected exception in Timed_Calculation_Task");
+ end Timed_Calculation_Task;
+
+
+ --========================================================--
+
+
+ Start_Time : constant Ada.Calendar.Time :=
+ Ada.Calendar.Time_of (1901,1,1);
+ Minute : constant Duration := 60.0;
+
+
+ --========================================================--
+
+
+begin -- Main program.
+
+ Report.Test ("C974002", "Asynchronous Select with Delay_Until");
+
+ -- take care of implementations that start the clock at 1/1/01
+ delay ImpDef.Delay_For_Time_Past;
+
+
+ Abortable_Part_Executed := False;
+ Triggering_Alternative_Executed := False;
+
+ NO_DELAY_SUBTEST:
+
+ declare
+ -- Set Expiry to a time which has already passed
+ Expiry : constant Ada.Calendar.Time := Start_Time;
+ Timed : Timed_Calculation_Task;
+ begin
+
+ -- Expiry is the time to be specified in the delay_until statement
+ -- of the asynchronous select. Since it has already passed, the
+ -- abortable part should not execute, and the sequence of statements
+ -- of the triggering alternative should be executed.
+
+ Timed.Calculation (Time_Out => Expiry); -- Asynchronous select
+ -- inside accept block.
+ if Abortable_Part_Executed then
+ Report.Failed ("No delay: Abortable part was executed");
+ end if;
+
+ if not Triggering_Alternative_Executed then
+ Report.Failed ("No delay: triggering alternative sequence " &
+ "of statements was not executed");
+ end if;
+ end No_Delay_Subtest;
+
+
+ Abortable_Part_Executed := False;
+ Triggering_Alternative_Executed := False;
+
+ LONG_DELAY_SUBTEST:
+
+ declare
+
+ -- Quick_Calculation should finish before expiry.
+ Expiry : constant Ada.Calendar.Time :=
+ Ada.Calendar.Clock + Minute;
+ Timed : Timed_Calculation_Task;
+
+ begin
+
+ -- Expiry is the time to be specified in the delay_until statement
+ -- of the asynchronous select. It should not pass before the abortable
+ -- part completes, at which time control should return to the caller;
+ -- the sequence of statements of the triggering alternative should
+ -- not be executed.
+
+ Timed.Calculation (Time_Out => Expiry); -- Asynchronous select.
+
+ if not Abortable_Part_Executed then
+ Report.Failed ("Long delay: Abortable part was not executed");
+ end if;
+
+ if Triggering_Alternative_Executed then
+ Report.Failed ("Long delay: triggering alternative sequence " &
+ "of statements was executed");
+ end if;
+ end Long_Delay_Subtest;
+
+
+ Report.Result;
+
+end C974002;