URL
https://opencores.org/ocsvn/openrisc/openrisc/trunk
Subversion Repositories openrisc
[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [testsuite/] [ada/] [acats/] [tests/] [ca/] [ca11d02.a] - Rev 720
Compare with Previous | Blame | View Log
-- CA11D02.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 an exception declared in a package can be raised by a-- child of a child package. Check that it can be renamed in the-- child of the child package and raised with the correct effect.---- TEST DESCRIPTION:-- Declare a package which defines complex number abstraction with-- user-defined exceptions (foundation code).---- Add a public child package to the above package. Declare two-- subprograms for the parent type.---- Add a public grandchild package to the foundation package. Declare-- subprograms to raise exceptions.---- In the main program, "with" the grandchild package, then check that-- the exceptions are raised and handled as expected. Ensure that-- exceptions are:-- 1) raised in the public grandchild package and handled/reraised to-- be handled by the main program.-- 2) raised and handled locally by the "others" handler in the-- public grandchild package.-- 3) raised in the public grandchild and propagated to the main-- program.---- TEST FILES:-- This test depends on the following foundation code:---- FA11D00.A------ CHANGE HISTORY:-- 06 Dec 94 SAIC ACVC 2.0----!-- Child package of FA11D00.package FA11D00.CA11D02_0 is -- Basic_Complexfunction "+" (Left, Right : Complex_Type)return Complex_Type; -- Add two complex numbers.function "*" (Left, Right : Complex_Type)return Complex_Type; -- Multiply two complex numbers.end FA11D00.CA11D02_0; -- Basic_Complex--=======================================================================--package body FA11D00.CA11D02_0 is -- Basic_Complexfunction "+" (Left, Right : Complex_Type) return Complex_Type isbeginreturn ( (Left.Real + Right.Real, Left.Imag + Right.Imag) );end "+";--------------------------------------------------------------function "*" (Left, Right : Complex_Type) return Complex_Type isbeginreturn ( Real => (Left.Real * Right.Real),Imag => (Left.Imag * Right.Imag) );end "*";end FA11D00.CA11D02_0; -- Basic_Complex--=======================================================================---- Child package of FA11D00.CA11D02_0.-- Grandchild package of FA11D00.package FA11D00.CA11D02_0.CA11D02_1 is -- Array_ComplexInverse_Error : exception renames Divide_Error; -- Reference to exception-- in grandparent package.Array_Size : constant := 2;type Complex_Array_Type isarray (1 .. Array_Size) of Complex_Type; -- Reference to type-- in parent package.function Multiply (Left : Complex_Array_Type; -- Multiply two complexRight : Complex_Array_Type) -- arrays.return Complex_Array_Type;function Add (Left, Right : Complex_Array_Type) -- Add two complexreturn Complex_Array_Type; -- arrays.procedure Inverse (Right : in Complex_Array_Type; -- Invert a complexLeft : in out Complex_Array_Type); -- array.end FA11D00.CA11D02_0.CA11D02_1; -- Array_Complex--=======================================================================--with Report;package body FA11D00.CA11D02_0.CA11D02_1 is -- Array_Complexfunction Multiply (Left : Complex_Array_Type;Right : Complex_Array_Type)return Complex_Array_Type is-- This procedure will raise an exception depending on the input-- parameter. The exception will be handled locally by the-- "others" handler.Result : Complex_Array_Type := (others => Zero);subtype Vector_Size is Positive range Left'Range;beginif Left = Result or else Right = Result then -- Do not multiply zero.raise Multiply_Error; -- Refence to exception in-- grandparent package.Report.Failed ("Program control not transferred by raise");elsefor I in Vector_Size loopResult(I) := ( Left(I) * Right(I) ); -- Basic_Complex."*".end loop;end if;return (Result);exceptionwhen others =>Report.Comment ("Exception is handled by others in Multiplication");TC_Handled_In_Grandchild_Pkg_Func := true;return (Zero, Zero);end Multiply;--------------------------------------------------------------function Add (Left, Right : Complex_Array_Type)return Complex_Array_Type is-- This function will raise an exception depending on the input-- parameter. The exception will be propagated and handled-- by the caller.Result : Complex_Array_Type := (others => Zero);subtype Vector_Size is Positive range Left'Range;beginif Left = Result or Right = Result then -- Do not add zero.raise Add_Error; -- Refence to exception in-- grandparent package.Report.Failed ("Program control not transferred by raise");elsefor I in Vector_Size loopResult(I) := ( Left(I) + Right(I) ); -- Basic_Complex."+".end loop;end if;return (Result);end Add;--------------------------------------------------------------procedure Inverse (Right : in Complex_Array_Type;Left : in out Complex_Array_Type) is-- This function will raise an exception depending on the input-- parameter. The exception will be handled/reraised to be-- handled by the caller.Result : Complex_Array_Type := (others => Zero);Array_With_Zero : boolean := false;beginfor I in 1 .. Right'Length loopif Right(I) = Zero then -- Check for zero.Array_With_Zero := true;end if;end loop;If Array_With_Zero thenraise Inverse_Error; -- Do not inverse zero.Report.Failed ("Program control not transferred by raise");elsefor I in 1 .. Array_Size loopLeft(I).Real := - Right(I).Real;Left(I).Imag := - Right(I).Imag;end loop;end if;exceptionwhen Inverse_Error =>TC_Handled_In_Grandchild_Pkg_Proc := true;Left := Result;raise; -- Reraise the Inverse_Error exception in the subtest.Report.Failed ("Exception not reraised in handler");when others =>Report.Failed ("Unexpected exception in procedure Inverse");end Inverse;end FA11D00.CA11D02_0.CA11D02_1; -- Array_Complex--=======================================================================--with FA11D00.CA11D02_0.CA11D02_1; -- Array_Complex,-- implicitly with Basic_Complex.with Report;procedure CA11D02 ispackage Complex_Pkg renames FA11D00;package Array_Complex_Pkg renames FA11D00.CA11D02_0.CA11D02_1;use Complex_Pkg;use Array_Complex_Pkg;beginReport.Test ("CA11D02", "Check that an exception declared in a package " &"can be raised by a child of a child package");Multiply_Complex_Subtest:declareOperand_1 : Complex_Array_Type:= ( Complex (Int_Type (Report.Ident_Int (3)),Int_Type (Report.Ident_Int (5))),Complex (Int_Type (Report.Ident_Int (2)),Int_Type (Report.Ident_Int (8))) );Operand_2 : Complex_Array_Type:= ( Complex (Int_Type (Report.Ident_Int (1)),Int_Type (Report.Ident_Int (2))),Complex (Int_Type (Report.Ident_Int (3)),Int_Type (Report.Ident_Int (6))) );Operand_3 : Complex_Array_Type := ( Zero, Zero);Mul_Result : Complex_Array_Type:= ( Complex (Int_Type (Report.Ident_Int (3)),Int_Type (Report.Ident_Int (10))),Complex (Int_Type (Report.Ident_Int (6)),Int_Type (Report.Ident_Int (48))) );Complex_No : Complex_Array_Type := (others => Zero);beginIf (Multiply (Operand_1, Operand_2) /= Mul_Result) thenReport.Failed ("Incorrect results from multiplication");end if;-- Error is raised and exception will be handled in grandchild package.Complex_No := Multiply (Operand_1, Operand_3);if Complex_No /= (Zero, Zero) thenReport.Failed ("Exception was not raised in multiplication");end if;exceptionwhen Multiply_Error =>Report.Failed ("Exception raised in multiplication and " &"propagated to caller");TC_Handled_In_Grandchild_Pkg_Func := false;-- Improper exception handling in caller.when others =>Report.Failed ("Unexpected exception in multiplication");TC_Handled_In_Grandchild_Pkg_Func := false;-- Improper exception handling in caller.end Multiply_Complex_Subtest;Add_Complex_Subtest:declareOperand_1 : Complex_Array_Type:= ( Complex (Int_Type (Report.Ident_Int (2)),Int_Type (Report.Ident_Int (7))),Complex (Int_Type (Report.Ident_Int (5)),Int_Type (Report.Ident_Int (8))) );Operand_2 : Complex_Array_Type:= ( Complex (Int_Type (Report.Ident_Int (4)),Int_Type (Report.Ident_Int (1))),Complex (Int_Type (Report.Ident_Int (2)),Int_Type (Report.Ident_Int (3))) );Operand_3 : Complex_Array_Type := ( Zero, Zero);Add_Result : Complex_Array_Type:= ( Complex (Int_Type (Report.Ident_Int (6)),Int_Type (Report.Ident_Int (8))),Complex (Int_Type (Report.Ident_Int (7)),Int_Type (Report.Ident_Int (11))) );Complex_No : Complex_Array_Type := (others => Zero);beginComplex_No := Add (Operand_1, Operand_2);If (Complex_No /= Add_Result) thenReport.Failed ("Incorrect results from addition");end if;-- Error is raised in grandchild package and exception-- will be propagated to caller.Complex_No := Add (Operand_1, Operand_3);if Complex_No = Add_Result thenReport.Failed ("Exception was not raised in addition");end if;exceptionwhen Add_Error =>TC_Propagated_To_Caller := true; -- Exception is propagated.when others =>Report.Failed ("Unexpected exception in addition subtest");TC_Propagated_To_Caller := false; -- Improper exception handling-- in caller.end Add_Complex_Subtest;Inverse_Complex_Subtest:declareOperand_1 : Complex_Array_Type:= ( Complex (Int_Type (Report.Ident_Int (1)),Int_Type (Report.Ident_Int (5))),Complex (Int_Type (Report.Ident_Int (3)),Int_Type (Report.Ident_Int (11))) );Operand_3 : Complex_Array_Type:= ( Zero, Complex (Int_Type (Report.Ident_Int (3)),Int_Type (Report.Ident_Int (6))) );Inv_Result : Complex_Array_Type:= ( Complex (Int_Type (Report.Ident_Int (-1)),Int_Type (Report.Ident_Int (-5))),Complex (Int_Type (Report.Ident_Int (-3)),Int_Type (Report.Ident_Int (-11))) );Complex_No : Complex_Array_Type := (others => Zero);beginInverse (Operand_1, Complex_No);if (Complex_No /= Inv_Result) thenReport.Failed ("Incorrect results from inverse");end if;-- Error is raised in grandchild package and exception-- will be handled/reraised to caller.Inverse (Operand_3, Complex_No);Report.Failed ("Exception was not handled in inverse");exceptionwhen Inverse_Error =>if not TC_Handled_In_Grandchild_Pkg_Proc thenReport.Failed ("Exception was not raised in inverse");elseTC_Handled_In_Caller := true; -- Exception is reraised from-- child package.end if;when others =>Report.Failed ("Unexpected exception in inverse");TC_Handled_In_Caller := false;-- Improper exception handling in caller.end Inverse_Complex_Subtest;if not (TC_Handled_In_Caller and -- Check to see that allTC_Handled_In_Grandchild_Pkg_Proc and -- exceptions were handledTC_Handled_In_Grandchild_Pkg_Func and -- in proper location.TC_Propagated_To_Caller)thenReport.Failed ("Exceptions handled in incorrect locations");end if;Report.Result;end CA11D02;
