-- CD33002.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 Component_Sizes that are multiples of the word
--      size are supported.
--
--      Check that for such Component_Sizes arrays contain no gaps between
--      components.
--
-- TEST DESCRIPTION:
--      This test defines three array types and specifies their layouts
--      using representation specifications for the 'Component_Size and
--      pragma Packs for each.  It then checks that the implied assumptions
--      about the resulting layout actually can be made.
--
-- 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
--      07 MAY 96   SAIC   Revised for 2.1
--      24 AUG 96   SAIC   Additional 2.1 revisions
--      16 FEB 98   EDS    Modify documentation.
--!

----------------------------------------------------------------- CD33002_0

with System;
package CD33002_0 is

  S_Units_per_Word : constant := System.Word_Size/System.Storage_Unit;

  type Nibble is mod 2**4;

  type Byte is mod 2**8;

  type Word_Stuff is array(Natural range <>) of Byte;
    for Word_Stuff'Component_Size
      use System.Word_Size;                                   -- ANX-C RQMT.
      pragma Pack(Word_Stuff);                                -- ANX-C RQMT.

  type Double_Stuff is array(Natural range <>) of Byte;
    for Double_Stuff'Component_Size
      use System.Word_Size * 2;     -- multiple               -- ANX-C RQMT.

  type Address_Calculator is record
    Item_1 : Nibble;
    Item_2 : Nibble;
  end record;

  for Address_Calculator use record
    Item_1 at 0 range 0..3;
    Item_2 at 1 range 0..3;
  end record;

  -- by definition (13.5.2(2)) abs(Item_2'Address - Item_1'Address) = 1
  -- it therefore follows that:
  --     Address_Calculator'Size = 2 * Addressable_Unit'Size

end CD33002_0;

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

-- there is no package body CD33002_0

------------------------------------------------------------------- CD33002

with Report;
with TCTouch;
with System.Storage_Elements;
with CD33002_0;
procedure CD33002 is

  use type System.Storage_Elements.Storage_Offset;

  A_Word   : CD33002_0.Word_Stuff(0..15);
 
  A_Double : CD33002_0.Double_Stuff(0..15);

  procedure Unexpected( Message : String; Wanted, Got: Integer ) is
  begin
    Report.Failed ( Message & " Wanted:"
                    & Integer'Image(Wanted) & " Got:" & Integer'Image(Got) );
  end Unexpected;

begin  -- Main test procedure.

  Report.Test ("CD33002", "Check that Component_Sizes that are multiples "
                        & "of the word size are supported. Check that for "
                        & "such Component_Sizes arrays contain no gaps "
                        & "between components" );

  if A_Word'Size /= CD33002_0.Word_Stuff'Component_Size * 16 then
    Unexpected("Word Size",
                CD33002_0.Word_Stuff'Component_Size * 16,
                A_Word'Size );
  end if;

  if A_Double'Size /= CD33002_0.Double_Stuff'Component_Size * 16 then
    Unexpected("Double word Size",
                CD33002_0.Double_Stuff'Component_Size * 16,
                A_Double'Size );
  end if;


  Report.Result;

end CD33002;
