-- CD90001.A -- -- Grant of Unlimited Rights -- -- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687 and -- F08630-91-C-0015, 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 Unchecked_Conversion is supported and is reversible in -- the cases where: -- Source'Size = Target'Size -- Source'Alignment = Target'Alignment -- Source and Target are both represented contiguously -- Bit pattern in Source is a meaningful value of Target type -- -- TEST DESCRIPTION: -- This test declares an enumeration type with a representation -- specification that should fit neatly into an 8 bit object; and a -- modular type that should also be able to fit easily into 8 bits; -- uses size representation clauses on both of them for 8 bit -- representations. It then defines two instances of -- Unchecked_Conversion; to convert both ways between the types. -- Using several distinctive values, it checks that the conversions -- are performed, and reversible. -- As a second case, the above is performed with an integer type and -- a packed array of booleans. -- -- APPLICABILITY CRITERIA: -- All implementations must compile this test. -- -- For implementations validating against Systems Programming Annex (C): -- this test must execute. -- -- For implementations not validating against Annex C: -- if this test compiles without error messages at compilation, -- it must bind and execute. -- -- -- CHANGE HISTORY: -- 22 JUL 95 SAIC Initial version -- 07 MAY 96 SAIC Changed Boolean to Character for 2.1 -- 27 JUL 96 SAIC Allowed for partial N/A to be PASS -- 14 FEB 97 PWB.CTA Corrected "=" to "/=" in alignment check. --! ----------------------------------------------------------------- CD90001_0 with Report; with Unchecked_Conversion; package CD90001_0 is -- Case 1 : Modular <=> Enumeration type Eight_Bits is mod 2**8; for Eight_Bits'Size use 8; type User_Enums is ( One, Two, Four, Eight, Sixteen, Thirty_Two, Sixty_Four, One_Twenty_Eight ); for User_Enums'Size use 8; for User_Enums use ( One => 1, -- N/A => ERROR. Two => 2, -- N/A => ERROR. Four => 4, -- N/A => ERROR. Eight => 8, -- N/A => ERROR. Sixteen => 16, -- N/A => ERROR. Thirty_Two => 32, -- N/A => ERROR. Sixty_Four => 64, -- N/A => ERROR. One_Twenty_Eight => 128 ); -- N/A => ERROR. function EB_2_UE is new Unchecked_Conversion( Eight_Bits, User_Enums ); function UE_2_EB is new Unchecked_Conversion( User_Enums, Eight_Bits ); procedure TC_Check_Case_1; -- Case 2 : Integer <=> Packed Character array type Signed_16 is range -2**15+1 .. 2**15-1; -- +1, -1 allows for both 1's and 2's comp type Bits_16 is array(0..1) of Character; pragma Pack(Bits_16); -- N/A => ERROR. function S16_2_B16 is new Unchecked_Conversion( Signed_16, Bits_16 ); function B16_2_S16 is new Unchecked_Conversion( Bits_16, Signed_16 ); procedure TC_Check_Case_2; end CD90001_0; -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- with Report; package body CD90001_0 is Check_List : constant array(1..8) of Eight_Bits := ( 1, 2, 4, 8, 16, 32, 64, 128 ); Check_Enum : constant array(1..8) of User_Enums := ( One, Two, Four, Eight, Sixteen, Thirty_Two, Sixty_Four, One_Twenty_Eight ); procedure TC_Check_Case_1 is Mod_Value : Eight_Bits; Enum_Val : User_Enums; begin for I in Check_List'Range loop if EB_2_UE(Check_List(I)) /= Check_Enum(I) then Report.Failed("EB => UE conversion failed"); end if; if Check_List(I) /= UE_2_EB(Check_Enum(I)) then Report.Failed ("EU => EB conversion failed"); end if; end loop; end TC_Check_Case_1; procedure TC_Check_Case_2 is S: Signed_16; T,U: Signed_16; B: Bits_16; C,D: Bits_16; -- allow for byte swapping begin --FDEC_BA98_7654_3210 S := 2#0011_0000_0111_0111#; B := S16_2_B16( S ); C := ( Character'Val(2#0011_0000#), Character'Val(2#0111_0111#) ); D := ( Character'Val(2#0111_0111#), Character'Val(2#0011_0000#) ); if (B /= C) and (B /= D) then Report.Failed("Int => Chararray conversion failed"); end if; B := ( Character'Val(2#0011_1100#), Character'Val(2#0101_0101#) ); S := B16_2_S16( B ); T := 2#0011_1100_0101_0101#; U := 2#0101_0101_0011_1100#; if (S /= T) and (S /= U) then Report.Failed("Chararray => Int conversion failed"); end if; end TC_Check_Case_2; end CD90001_0; ------------------------------------------------------------------- CD90001 with Report; with CD90001_0; procedure CD90001 is Eight_NA : Boolean := False; Sixteen_NA : Boolean := False; begin -- Main test procedure. Report.Test ("CD90001", "Check that Unchecked_Conversion is supported " & "and is reversible in appropriate cases" ); Eight_Bit_Case: begin if CD90001_0.User_Enums'Size /= CD90001_0.Eight_Bits'Size then Report.Comment("The sizes of the 8 bit types used in this test " & "do not match" ); Eight_NA := True; elsif CD90001_0.User_Enums'Alignment /= CD90001_0.Eight_Bits'Alignment then Report.Comment("The alignments of the 8 bit types used in this " & "test do not match" ); Eight_NA := True; else CD90001_0.TC_Check_Case_1; end if; exception when Constraint_Error => Report.Failed("Constraint_Error raised in 8 bit case"); when others => Report.Failed("Unexpected exception raised in 8 bit case"); end Eight_Bit_Case; Sixteen_Bit_Case: begin if CD90001_0.Signed_16'Size /= CD90001_0.Bits_16'Size then Report.Comment("The sizes of the 16 bit types used in this test " & "do not match" ); Sixteen_NA := True; elsif CD90001_0.Signed_16'Alignment = CD90001_0.Bits_16'Alignment then Report.Comment("The alignments of the 16 bit types used in this " & "test do not match" ); Sixteen_NA := True; else CD90001_0.TC_Check_Case_2; end if; exception when Constraint_Error => Report.Failed("Constraint_Error raised in 16 bit case"); when others => Report.Failed("Unexpected exception raised in 16 bit case"); end Sixteen_Bit_Case; if Eight_NA and Sixteen_NA then Report.Not_Applicable("No cases in this test apply"); end if; Report.Result; end CD90001;