| -- 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; |