-- CD10001.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 representation items may contain nonstatic expressions
--      in the case that each expression in  the representation item is a
--      name that statically denotes a constant declared before the entity.
--
--
-- TEST DESCRIPTION:
--      For each of the specific items in the objective, this test checks
--      an example of each of the categories of representation specification
--      that are applicable to that objective, to wit:
--        address clause ....................... Expressions need not be static
--        alignment clause ..................... Expressions must be static
--        bit order clause ..................... Not tested
--        component size clause ................ Expressions must be static
--        enumeration representation clause .... Expressions must be static
--        external tag clause .................. Expressions must be static
--        Import, Export and Convention pragmas  Not tested
--        input clause ......................... Not tested
--        output clause ........................ Not tested
--        Pack pragma .......................... Not tested
--        read clause .......................... Not tested
--        record representation clause ......... Expressions must be static
--        size clause .......................... Expressions must be static
--        small clause ......................... Expressions must be static
--        storage pool clause .................. Not tested
--        storage size clause .................. Expressions must be static
--        write clause ......................... Not tested
--
-- APPLICABILITY CRITERIA:
--      All implementations must attempt to 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.
--
-- PASS/FAIL CRITERIA:
--      For implementations validating against Systems Programming Annex (C):
--        this test must execute, report PASSED, and complete normally,
--        otherwise the test FAILS
--
--      For implementations not validating against Annex C:
--        PASSING behavior is:
--          this test executes, reports PASSED, and completes normally
--        or
--          this test executes and reports NOT_APPLICABLE
--        or
--          this test produces at least one error message at compilation, and
--          the error message is associated with one of the items marked:
--             -- N/A => ERROR.
--
--      All other behaviors are FAILING.
--

-- CHANGE HISTORY:
--      11 JUL 95   SAIC  Initial version
--      10 MAR 97   PWB.CTA Made Nonstatic_Entity nonstatic; changed
--                        Tenths'Small from 1.0/32.0 to 1.0/10.0,
--                        as expected by the later check; improved
--                        internal documentation.
--      16 FEB 98   EDS   Modified test documentation.
--      24 NOV 98   RLB   Changed Tenths'Small to 1.0/32.0, as this is
--                        necessary so that all implementations can
--                        process this test. (3.5.9(21) means non-binary
--                        smalls are optional.)
--      11 MAR 99   RLB   Merged versions. Most EDS changes removed (as
--                        they made the test less applicable than the ACAA
--                        version).
--!

----------------------------------------------------------------- CD10001_0

with System;
with System.Storage_Elements;
with Impdef;
with SPPRT13;
package CD10001_0 is

  -- a few types and objects to work with.

  type Int is range -2048 .. 2047;
  My_Int : Int := 1024;

  type Enumeration is (First, Second, Third, Fourth, Fifth);

  -- a few names that statically denote constants:

  Nonstatic_Entity : constant System.Address :=                  -- Non-static
     System.Storage_Elements."+" 
       ( SPPRT13.Variable_Address, 
         System.Storage_Elements.Storage_Offset'(0) );

  Tag_String : constant String := Impdef.External_Tag_Value;     -- Static
  -- Check to ensure that Tag_String is static
  Tag_String_Length : constant := Tag_String'Length;

  A_Reasonable_Size_Value : constant := System.Storage_Unit;     -- Static
 
  Zero  : constant := 0;                                         -- Static
  One   : constant := 1;                                         -- Static
  Two   : constant := 2;                                         -- Static
  Three : constant := 3;                                         -- Static
  Four  : constant := 4;                                         -- Static
  Five  : constant := 5;                                         -- Static

  K : constant Int := My_Int;                                    -- Non-Static

--      Check that representation items containing nonstatic expressions are
--      supported in the case that the representation item is a name that
--      statically denotes a constant declared before the entity.
--
--        address clause
--        Expression must be static - RM 13.3(12)

  Object_Address : Enumeration;
    for Object_Address'Address use Nonstatic_Entity;          -- N/A => ERROR.

--        alignment clause
--        Expression must be static - RM 13.3(25)

  Object_Alignment : Enumeration;
    for Object_Alignment'Alignment use One;                   -- N/A => ERROR.
  
--        bit order clause
-- no interesting test can be specified

--        component size clause
--        Expression must be static - RM 13.3(69)

  type Array_With_Components is array(1..10) of Enumeration;
    for Array_With_Components'Component_Size
      use A_Reasonable_Size_Value;                            -- N/A => ERROR.

--        enumeration representation clause
--        Expressions must be static - RM 13.4(6)

  type Enumeration_1 is (First, Second, Third);
  for Enumeration_1 use (First => One, Second => Two, Third => Three);

--        external tag clause
--        Expression must be static - RM 13.3(75)

  type Some_Tagged_Type is tagged null record;
    for Some_Tagged_Type'External_Tag use Tag_String;         -- N/A => ERROR.

--        Import, Export and Convention pragmas
-- no interesting test can be specified

--        input clause
-- no interesting test can be specified

--        output clause
-- no interesting test can be specified

--        Pack pragma
-- no interesting test can be specified

--        read clause
-- no interesting test can be specified

--        record representation clause
--        Expressions must be static - RM 13.3(10)

  type Record_To_Layout is record
    Bit_0 : Boolean;
    Bit_1 : Boolean;
  end record;
    for Record_To_Layout use record                           -- N/A => ERROR.
      Bit_0 at Zero range Zero..Zero;                         -- N/A => ERROR.
      Bit_1 at Zero range Four..Four;                         -- N/A => ERROR.
    end record;                                               -- N/A => ERROR.

--        size clause
--        Expression must be static - RM 13.3(41)

  Object_Size : Enumeration;
    for Object_Size'Size use A_Reasonable_Size_Value;         -- N/A => ERROR.

--        small clause
--        Expression must be static - RM 3.5.10(2)

  type Tenths is delta 0.1 range 0.0..10.0;
    for Tenths'Small use 1.0 / (Two ** Five);                 -- N/A => ERROR.

--        storage pool clause
--        Not tested

--        storage size clause
--        Expression may be non-static - RM 13.11(15)
  type Reference is access Record_To_Layout;
    for Reference'Storage_Size use Four * K;                  -- N/A => ERROR.


--        write clause
-- no interesting test can be specified

  procedure TC_Check_Values;

end CD10001_0;

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

with TCTouch;
package body CD10001_0 is

  use type System.Address;

  procedure Assert( Truth : Boolean; Message: String ) is
  begin
    if not Truth then
      TCTouch.Implementation_Check( Message );
    end if;
  end Assert;

  procedure TC_Check_Values is
    Record_Object : Record_To_Layout;
  begin

    Assert(Object_Address'Address = Nonstatic_Entity,
           "Object not at specified address");

    Assert(Object_Alignment'Alignment >= One,
           "Object not at specified alignment");

    Assert(Array_With_Components'Component_Size = A_Reasonable_Size_Value,
           "Array Components not specified size");

-- I don't see how to reliably check this one:
--
--  type Enumeration_1 is (First, Second, Third);
--  for Enumeration_1 use (First => One, Second => Two, Third => Three);

    Assert(Some_Tagged_Type'External_Tag = Tag_String,
           "External_Tag not specified value");
    Assert(Record_Object.Bit_0'First_Bit = Zero,
          "Record object First_Bit not zero");

    Assert(Record_Object.Bit_1'Last_Bit = Four,
          "Record object Last_Bit not four");

    Assert(Object_Size'Size = A_Reasonable_Size_Value,
           "Object size not specified value");

    Assert(Tenths'Small = 1.0 / Two ** Five,
           "Tenths small not specified value");

    Assert(Reference'Storage_Size = 4096, -- Four * K,
           "Reference storage size not specified value");

  end TC_Check_Values;

end CD10001_0;

------------------------------------------------------------------- CD10001

with Report;
with CD10001_0;

procedure CD10001 is

begin  -- Main test procedure.

  Report.Test ("CD10001", "Check that representation items containing " &
                          "nonstatic expressions are supported in the " &
                          "case that the representation item is a name " &
                          "that statically denotes a constant declared " &
                          "before the entity" );

  CD10001_0.TC_Check_Values;

  Report.Result;

end CD10001;
