-- CD30001.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 X'Address produces a useful result when X is an aliased -- object. -- Check that X'Address produces a useful result when X is an object of -- a by-reference type. -- Check that X'Address produces a useful result when X is an entity -- whose Address has been specified. -- -- Check that aliased objects and subcomponents are allocated on storage -- element boundaries. Check that objects and subcomponents of by -- reference types are allocated on storage element boundaries. -- -- Check that for an array X, X'Address points at the first component -- of the array, and not at the array bounds. -- -- TEST DESCRIPTION: -- This test defines a data structure (an array of records) where each -- aspect of the data structure is aliased. The test checks 'Address -- for each "layer" of aliased objects. -- -- APPLICABILITY CRITERIA: -- All implementations must attempt to compile this test. -- -- For implementations validating against Systems Programming Annex (C): -- this test must execute and report PASSED. -- -- For implementations not validating against Annex C: -- this test may report compile time errors at one or more points -- indicated by "-- ANX-C RQMT", in which case it may be graded as inapplicable. -- Otherwise, the test must execute and report PASSED. -- -- -- CHANGE HISTORY: -- 22 JUL 95 SAIC Initial version -- 08 MAY 96 SAIC Reinforced for 2.1 -- 16 FEB 98 EDS Modified documentation --! ----------------------------------------------------------------- CD30001_0 with SPPRT13; package CD30001_0 is -- Check that X'Address produces a useful result when X is an aliased -- object. -- Check that X'Address produces a useful result when X is an object of -- a by-reference type. -- Check that X'Address produces a useful result when X is an entity -- whose Address has been specified. -- (using the new form of "for X'Address use ...") -- -- Check that aliased objects and subcomponents are allocated on storage -- element boundaries. Check that objects and subcomponents of by -- reference types are allocated on storage element boundaries. type Simple_Enum_Type is (Just, A, Little, Bit); type Data is record Aliased_Comp_1 : aliased Simple_Enum_Type; Aliased_Comp_2 : aliased Simple_Enum_Type; end record; type Array_W_Aliased_Comps is array(1..2) of aliased Data; Aliased_Object : aliased Array_W_Aliased_Comps; Specific_Object : aliased Array_W_Aliased_Comps; for Specific_Object'Address use SPPRT13.Variable_Address2; -- ANX-C RQMT. procedure TC_Check_Aliased_Addresses; procedure TC_Check_Specific_Addresses; procedure TC_Check_By_Reference_Types; end CD30001_0; -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- with Report; with System.Storage_Elements; with System.Address_To_Access_Conversions; package body CD30001_0 is package Simple_Enum_Type_Ref_Conv is new System.Address_To_Access_Conversions(Simple_Enum_Type); package Data_Ref_Conv is new System.Address_To_Access_Conversions(Data); package Array_W_Aliased_Comps_Ref_Conv is new System.Address_To_Access_Conversions(Array_W_Aliased_Comps); use type System.Address; use type System.Storage_Elements.Integer_Address; use type System.Storage_Elements.Storage_Offset; procedure TC_Check_Aliased_Addresses is use type Simple_Enum_Type_Ref_Conv.Object_Pointer; use type Data_Ref_Conv.Object_Pointer; use type Array_W_Aliased_Comps_Ref_Conv.Object_Pointer; begin -- Check the object Aliased_Object if Aliased_Object'Address not in System.Address then Report.Failed("Aliased_Object'Address not an address"); end if; if Array_W_Aliased_Comps_Ref_Conv.To_Pointer(Aliased_Object'Address) /= Aliased_Object'Unchecked_Access then Report.Failed ("'Unchecked_Access does not match expected address value"); end if; -- Check the element Aliased_Object(1) if Data_Ref_Conv.To_Address( Aliased_Object(1)'Access ) /= Aliased_Object(1)'Address then Report.Failed ("Array element 'Access does not match expected address value"); end if; -- Check that Array'Address points at the first component... if Array_W_Aliased_Comps_Ref_Conv.To_Address( Aliased_Object'Access ) /= Aliased_Object(1)'Address then Report.Failed ("Address of array object does not equal address of first component"); end if; -- Check the components of Aliased_Object(2) if Simple_Enum_Type_Ref_Conv.To_Address( Aliased_Object(2).Aliased_Comp_1'Unchecked_Access) not in System.Address then Report.Failed("Component 2 'Unchecked_Access not a valid address"); end if; if Aliased_Object(2).Aliased_Comp_2'Address not in System.Address then Report.Failed("Component 2 not located at a valid address "); end if; end TC_Check_Aliased_Addresses; procedure TC_Check_Specific_Addresses is use type System.Address; use type System.Storage_Elements.Integer_Address; use type Simple_Enum_Type_Ref_Conv.Object_Pointer; use type Data_Ref_Conv.Object_Pointer; use type Array_W_Aliased_Comps_Ref_Conv.Object_Pointer; begin -- Check the object Specific_Object if System.Storage_Elements.To_Integer(Specific_Object'Address) /= System.Storage_Elements.To_Integer(SPPRT13.Variable_Address2) then Report.Failed ("Specific_Object not at address specified in representation clause"); end if; if Array_W_Aliased_Comps_Ref_Conv.To_Pointer(SPPRT13.Variable_Address2) /= Specific_Object'Unchecked_Access then Report.Failed("Specific_Object'Unchecked_Access not expected value"); end if; -- Check the element Specific_Object(1) if Data_Ref_Conv.To_Address( Specific_Object(1)'Access ) /= Specific_Object(1)'Address then Report.Failed ("Specific Array element 'Access does not correspond to the " & "elements 'Address"); end if; -- Check that Array'Address points at the first component... if Array_W_Aliased_Comps_Ref_Conv.To_Address( Specific_Object'Access ) /= Specific_Object(1)'Address then Report.Failed ("Address of array object does not equal address of first component"); end if; -- Check the components of Specific_Object(2) if Simple_Enum_Type_Ref_Conv.To_Address( Specific_Object(1).Aliased_Comp_1'Access) not in System.Address then Report.Failed("Access value of first record component for object at " & "specific address not a valid address"); end if; if Specific_Object(2).Aliased_Comp_2'Address not in System.Address then Report.Failed("Second record component for object at specific " & "address not located at a valid address"); end if; end TC_Check_Specific_Addresses; -- Check that X'Address produces a useful result when X is an object of -- a by-reference type. type Tagged_But_Not_Exciting is tagged record A_Bit_Of_Data : Boolean; end record; Tagged_Object : Tagged_But_Not_Exciting; procedure Muck_With_Addresses( It : in out Tagged_But_Not_Exciting; Its_Address : in System.Address ) is begin if It'Address /= Its_Address then Report.Failed("Address of object passed by reference does not " & "match address of object passed" ); end if; end Muck_With_Addresses; procedure TC_Check_By_Reference_Types is begin Muck_With_Addresses( Tagged_Object, Tagged_Object'Address ); end TC_Check_By_Reference_Types; end CD30001_0; ------------------------------------------------------------------- CD30001 with Report; with CD30001_0; procedure CD30001 is begin -- Main test procedure. Report.Test ("CD30001", "Check that X'Address produces a useful result when X is " & "an aliased object, or an entity whose Address has been " & "specified" ); -- Check that X'Address produces a useful result when X is an aliased -- object. -- -- Check that aliased objects and subcomponents are allocated on storage -- element boundaries. Check that objects and subcomponents of by -- reference types are allocated on storage element boundaries. CD30001_0.TC_Check_Aliased_Addresses; -- Check that X'Address produces a useful result when X is an entity -- whose Address has been specified. CD30001_0.TC_Check_Specific_Addresses; -- Check that X'Address produces a useful result when X is an object of -- a by-reference type. CD30001_0.TC_Check_By_Reference_Types; Report.Result; end CD30001;