-- C3A1001.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 the full type completing a type with no discriminant part
--      or an unknown discriminant part may have explicitly declared or
--      inherited discriminants.
--      Check for cases where the types are records and protected types.
--
-- TEST DESCRIPTION:
--      Declare two groups of incomplete types: one group with no discriminant 
--      part and one group with unknown discriminant part.  Both groups of 
--      incomplete types are completed with both explicit and inherited 
--      discriminants.  Discriminants for record and protected types are 
--      declared with default and non default values.
--      In the main program, verify that objects of both groups of incomplete 
--      types can be created by default values or by assignments.
--
--
-- CHANGE HISTORY:
--      11 Oct 95   SAIC    Initial prerelease version.
--      11 Nov 96   SAIC    Revised for version 2.1.
--
--!

package C3A1001_0 is

   type Incomplete1 (<>);                          -- unknown discriminant

   type Incomplete2;                               -- no discriminant

   type Incomplete3 (<>);                          -- unknown discriminant

   type Incomplete4;                               -- no discriminant

   type Incomplete5 (<>);                          -- unknown discriminant

   type Incomplete6;                               -- no discriminant

   type Incomplete8;                               -- no discriminant

   subtype Small_Int is Integer range 1 .. 10;

   type Enu_Type is (M, F);

   type Incomplete1 (Disc : Enu_Type) is           -- unknown discriminant/
     record                                        -- explicit discriminant 
        case Disc is
           when M => MInteger : Small_Int := 3;
           when F => FInteger : Small_Int := 8;
        end case;
     end record;

   type Incomplete2 (Disc : Small_Int := 8) is     -- no discriminant/  
     record                                        -- explicit discriminant 
        ID : String (1 .. Disc) := "Plymouth";
     end record;

   type Incomplete3 is new Incomplete2;            -- unknown discriminant/
                                                   -- inherited discriminant

   type Incomplete4 is new Incomplete2;            -- no discriminant/  
                                                   -- inherited discriminant   
                                                   
   protected type Incomplete5                      -- unknown discriminant/
     (Disc : Enu_Type) is                          -- explicit discriminant
        function Get_Priv_Val return Enu_Type;     
   private
      Enu_Obj : Enu_Type := Disc;
   end Incomplete5;    

   protected type Incomplete6                      -- no discriminant/  
     (Disc : Small_Int := 1) is                    -- explicit discriminant
        function Get_Priv_Val return Small_Int;    -- with default
   private
      Num : Small_Int := Disc;
   end Incomplete6;

   type Incomplete8 (Disc : Small_Int) is          -- no discriminant/  
     record                                        -- explicit discriminant
       Str : String (1 .. Disc);                   -- no default
     end record;

   type Incomplete9 is new Incomplete8;

   function Return_String (S : String) return String;

end C3A1001_0;

     --==================================================================--

with Report;

package body C3A1001_0 is

   protected body Incomplete5 is    

      function Get_Priv_Val return Enu_Type is
      begin
         return Enu_Obj;
      end Get_Priv_Val; 

    end Incomplete5; 

   ----------------------------------------------------------------------
   protected body Incomplete6 is                                             
            
      function Get_Priv_Val return Small_Int is
      begin
         return Num;
      end Get_Priv_Val; 

    end Incomplete6; 

   ----------------------------------------------------------------------
   function Return_String (S : String) return String is
   begin
      if Report.Ident_Bool(True) = True then
         return S;
      end if;

      return S;
   end Return_String;
   
end C3A1001_0;

     --==================================================================--

with Report;

with C3A1001_0;
use  C3A1001_0;

procedure C3A1001 is

   -- Discriminant value comes from default.

   Incomplete2_Obj_1 :  Incomplete2;                

   Incomplete4_Obj_1 :  Incomplete4;

   Incomplete6_Obj_1 :  Incomplete6;                

   -- Discriminant value comes from explicit constraint.

   Incomplete1_Obj_1 :  Incomplete1 (F);              

   Incomplete5_Obj_1 :  Incomplete5 (M);               

   Incomplete6_Obj_2 :  Incomplete6 (2);           

   -- Discriminant value comes from assignment.        

   Incomplete3_Obj_1 :  Incomplete3 := (Disc => 6, ID => "Sentra");       

   Incomplete1_Obj_2 :  Incomplete1 := (Disc => M, MInteger => 9);    
                                  
   Incomplete2_Obj_2 :  Incomplete2 := (Disc => 5, ID => "Buick");    
                                  
begin

   Report.Test ("C3A1001", "Check that the full type completing a type " &
                "with no discriminant part or an unknown discriminant "  &
                "part may have explicitly declared or inherited "        &
                "discriminants.  Check for cases where the types are "   &
                "records and protected types");

   -- Check the initial values.

   if (Incomplete2_Obj_1.Disc /= 8) or
      (Incomplete2_Obj_1.ID   /= "Plymouth") then
         Report.Failed ("Wrong initial values for Incomplete2_Obj_1");
   end if;

   if (Incomplete4_Obj_1.Disc /= 8) or
      (Incomplete4_Obj_1.ID   /= "Plymouth") then
         Report.Failed ("Wrong initial values for Incomplete4_Obj_1");
   end if;

   if (Incomplete6_Obj_1.Disc         /= 1) or
      (Incomplete6_Obj_1.Get_Priv_Val /= 1) then
         Report.Failed ("Wrong initial value for Incomplete6_Obj_1");
   end if;

   -- Check the explicit values.

   if (Incomplete1_Obj_1.Disc     /= F) or 
      (Incomplete1_Obj_1.FInteger /= 8) then
         Report.Failed ("Wrong values for Incomplete1_Obj_1");
   end if;

   if (Incomplete5_Obj_1.Disc         /= M) or  
      (Incomplete5_Obj_1.Get_Priv_Val /= M) then
         Report.Failed ("Wrong value for Incomplete5_Obj_1");
   end if;

   if (Incomplete6_Obj_2.Disc         /= 2) or
      (Incomplete6_Obj_2.Get_Priv_Val /= 2) then
         Report.Failed ("Wrong value for Incomplete6_Obj_2");
   end if;

   -- Check the assigned values.

   if (Incomplete3_Obj_1.Disc /= 6) or 
      (Incomplete3_Obj_1.ID   /= "Sentra") then
         Report.Failed ("Wrong values for Incomplete3_Obj_1");
   end if;

   if (Incomplete1_Obj_2.Disc     /= M) or
      (Incomplete1_Obj_2.MInteger /= 9) then
         Report.Failed ("Wrong values for Incomplete1_Obj_2");
   end if;

   if (Incomplete2_Obj_2.Disc /= 5) or 
      (Incomplete2_Obj_2.ID   /= "Buick") then
         Report.Failed ("Wrong values for Incomplete2_Obj_2");
   end if;

   -- Make sure that assignments work without problems.

   Incomplete1_Obj_1.FInteger := 1;

   -- Avoid optimization (dead variable removal of FInteger):

   if Incomplete1_Obj_1.FInteger /= Report.Ident_Int(1) 
      then  
         Report.Failed ("Wrong value stored in Incomplete1_Obj_1.FInteger");
   end if;

   Incomplete2_Obj_1.ID       := Return_String ("12345678");

   -- Avoid optimization (dead variable removal of ID)

   if Incomplete2_Obj_1.ID /= Return_String ("12345678")
     then   
        Report.Failed ("Wrong values for Incomplete8_Obj_1.ID");
   end if;

   Incomplete4_Obj_1.ID       := Return_String ("87654321");

   -- Avoid optimization (dead variable removal of ID)

   if Incomplete4_Obj_1.ID /= Return_String ("87654321")
     then   
        Report.Failed ("Wrong values for Incomplete4_Obj_1.ID");
   end if;


   Test1:
   declare
   
      Incomplete8_Obj_1 :  Incomplete8 (10);

   begin
      Incomplete8_Obj_1.Str := "Merry Xmas";

      -- Avoid optimization (dead variable removal of Str):

      if Return_String (Incomplete8_Obj_1.Str) /= "Merry Xmas"
        then   
           Report.Failed ("Wrong values for Incomplete8_Obj_1.Str");
      end if;

   exception
      when Constraint_Error =>
          Report.Failed ("Constraint_Error raised in Incomplete8_Obj_1");

   end Test1;

   Test2:
   declare

      Incomplete8_Obj_2 :  Incomplete8 (5);

   begin
      Incomplete8_Obj_2.Str := "Happy";       

      -- Avoid optimization (dead variable removal of Str):

      if Return_String (Incomplete8_Obj_2.Str) /= "Happy"               
        then   
           Report.Failed ("Wrong values for Incomplete8_Obj_1.Str");
      end if;

   exception
      when Constraint_Error =>
          Report.Failed ("Constraint_Error raised in Incomplete8_Obj_2");

   end Test2;

   Report.Result;

end C3A1001;
