aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/ada/acats/tests/cb/cb20001.a
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.9/gcc/testsuite/ada/acats/tests/cb/cb20001.a')
-rw-r--r--gcc-4.9/gcc/testsuite/ada/acats/tests/cb/cb20001.a228
1 files changed, 228 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/ada/acats/tests/cb/cb20001.a b/gcc-4.9/gcc/testsuite/ada/acats/tests/cb/cb20001.a
new file mode 100644
index 000000000..ccfad52e4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/ada/acats/tests/cb/cb20001.a
@@ -0,0 +1,228 @@
+-- CB20001.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 exceptions can be handled in accept bodies, and that a
+-- task object that has an exception handled in an accept body is still
+-- viable for future use.
+--
+-- TEST DESCRIPTION:
+-- Declare a task that has exception handlers within an accept
+-- statement in the task body. Declare a task object, and make entry
+-- calls with data that will cause various exceptions to be raised
+-- by the accept statement. Ensure that the exceptions are:
+-- 1) raised and handled locally in the accept body
+-- 2) raised in the accept body and handled/reraised to be handled
+-- by the task body
+-- 3) raised in the accept body and propagated to the calling
+-- procedure.
+--
+--
+-- CHANGE HISTORY:
+-- 06 Dec 94 SAIC ACVC 2.0
+--
+--!
+
+with Report;
+
+package CB20001_0 is
+
+ Incorrect_Data,
+ Location_Error,
+ Off_Screen_Data : exception;
+
+ TC_Handled_In_Accept,
+ TC_Reraised_In_Accept,
+ TC_Handled_In_Task_Block,
+ TC_Handled_In_Caller : boolean := False;
+
+ type Location_Type is range 0 .. 2000;
+
+ task type Submarine_Type is
+ entry Contact (Location : in Location_Type);
+ end Submarine_Type;
+
+ Current_Position : Location_Type := 0;
+
+end CB20001_0;
+
+
+ --=================================================================--
+
+
+package body CB20001_0 is
+
+
+ task body Submarine_Type is
+ begin
+ loop
+
+ Task_Block:
+ begin
+ select
+ accept Contact (Location : in Location_Type) do
+ if Location > 1000 then
+ raise Off_Screen_Data;
+ elsif (Location > 500) and (Location <= 1000) then
+ raise Location_Error;
+ elsif (Location > 100) and (Location <= 500) then
+ raise Incorrect_Data;
+ else
+ Current_Position := Location;
+ end if;
+ exception
+ when Off_Screen_Data =>
+ TC_Handled_In_Accept := True;
+ when Location_Error =>
+ TC_Reraised_In_Accept := True;
+ raise; -- Reraise the Location_Error exception
+ -- in the task block.
+ end Contact;
+ or
+ terminate;
+ end select;
+
+ exception
+
+ when Off_Screen_Data =>
+ TC_Handled_In_Accept := False;
+ Report.Failed ("Off_Screen_Data exception " &
+ "improperly handled in task block");
+
+ when Location_Error =>
+ TC_Handled_In_Task_Block := True;
+ end Task_Block;
+
+ end loop;
+
+ exception
+
+ when Location_Error | Off_Screen_Data =>
+ TC_Handled_In_Accept := False;
+ TC_Handled_In_Task_Block := False;
+ Report.Failed ("Exception improperly propagated out to task body");
+ when others =>
+ null;
+ end Submarine_Type;
+
+end CB20001_0;
+
+
+ --=================================================================--
+
+
+with CB20001_0;
+with Report;
+with ImpDef;
+
+procedure CB20001 is
+
+ package Submarine_Tracking renames CB20001_0;
+
+ Trident : Submarine_Tracking.Submarine_Type; -- Declare task
+ Sonar_Contact : Submarine_Tracking.Location_Type;
+
+ TC_LEB_Error,
+ TC_Main_Handler_Used : Boolean := False;
+
+begin
+
+ Report.Test ("CB20001", "Check that exceptions can be handled " &
+ "in accept bodies");
+
+
+ Off_Screen_Block:
+ begin
+ Sonar_Contact := 1500;
+ Trident.Contact (Sonar_Contact); -- Cause Off_Screen_Data exception
+ -- to be raised and handled in a task
+ -- accept body.
+ exception
+ when Submarine_Tracking.Off_Screen_Data =>
+ TC_Main_Handler_Used := True;
+ Report.Failed ("Off_Screen_Data exception improperly handled " &
+ "in calling procedure");
+ when others =>
+ Report.Failed ("Exception handled unexpectedly in " &
+ "Off_Screen_Block");
+ end Off_Screen_Block;
+
+
+ Location_Error_Block:
+ begin
+ Sonar_Contact := 700;
+ Trident.Contact (Sonar_Contact); -- Cause Location_Error exception
+ -- to be raised in task accept body,
+ -- propogated to a task block, and
+ -- handled there. Corresponding
+ -- exception propagated here also.
+ Report.Failed ("Expected exception not raised");
+ exception
+ when Submarine_Tracking.Location_Error =>
+ TC_LEB_Error := True;
+ when others =>
+ Report.Failed ("Exception handled unexpectedly in " &
+ "Location_Error_Block");
+ end Location_Error_Block;
+
+
+ Incorrect_Data_Block:
+ begin
+ Sonar_Contact := 200;
+ Trident.Contact (Sonar_Contact); -- Cause Incorrect_Data exception
+ -- to be raised in task accept body,
+ -- propogated to calling procedure.
+ Report.Failed ("Expected exception not raised");
+ exception
+ when Submarine_Tracking.Incorrect_Data =>
+ Submarine_Tracking.TC_Handled_In_Caller := True;
+ when others =>
+ Report.Failed ("Exception handled unexpectedly in " &
+ "Incorrect_Data_Block");
+ end Incorrect_Data_Block;
+
+
+ if TC_Main_Handler_Used or
+ not (Submarine_Tracking.TC_Handled_In_Caller and -- Check to see that
+ Submarine_Tracking.TC_Handled_In_Task_Block and -- all exceptions
+ Submarine_Tracking.TC_Handled_In_Accept and -- were handled in
+ Submarine_Tracking.TC_Reraised_In_Accept and -- proper locations.
+ TC_LEB_Error)
+ then
+ Report.Failed ("Exceptions handled in incorrect locations");
+ end if;
+
+ if Integer(Submarine_Tracking.Current_Position) /= 0 then
+ Report.Failed ("Variable incorrectly written in task processing");
+ end if;
+
+ delay ImpDef.Minimum_Task_Switch;
+ if Trident'Callable then
+ Report.Failed ("Task didn't terminate with exception propagation");
+ end if;
+
+ Report.Result;
+
+end CB20001;