-- C3A1002.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 tagged records and task 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 task types are declared with both 
--      default and non default values.  Discriminants for tagged types are 
--      only declared without 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:
--      23 Oct 95   SAIC    Initial prerelease version.
--      19 Oct 96   SAIC    ACVC 2.1: modified test description.  Initialized
--                          Int_Val.
--
--!

package C3A1002_0 is

   subtype Small_Int is Integer range 1 .. 15;

   type Enu_Type is (M, F);

   type Tag_Type is tagged         
     record                                          
        I : Small_Int := 1;
     end record;

   type NTag_Type (D : Small_Int) is new Tag_Type with
     record                                          
        S : String (1 .. D) := "Aloha";  
     end record;

   type Incomplete1;                               -- no discriminant

   type Incomplete2 (<>);                          -- unknown discriminant

   type Incomplete3;                               -- no discriminant

   type Incomplete4 (<>);                          -- unknown discriminant

   type Incomplete5;                               -- no discriminant

   type Incomplete6 (<>);                          -- unknown discriminant

   type Incomplete1 (D1 : Enu_Type) is tagged      -- no discriminant/  
     record                                        -- explicit discriminant
        case D1 is
           when M => MInteger : Small_Int := 9;
           when F => FInteger : Small_Int := 8;
        end case;
     end record;

   type Incomplete2 (D2 : Small_Int) is new       -- unknown discriminant/
     Incomplete1 (D1 => F) with record            -- explicit discriminant
        ID : String (1 .. D2) := "ACVC95";
     end record;

   type Incomplete3 is new                         -- no discriminant/
     NTag_Type with record                         -- inherited discriminant
        E : Enu_Type := M;
     end record;

   type Incomplete4 is new                         -- unknown discriminant/
     NTag_Type (D => 3) with record                -- inherited discriminant
        E : Enu_Type := F;
     end record;

   task type Incomplete5 (D5 : Enu_Type) is      -- no discriminant/
      entry Read_Disc (P : out Enu_Type);        -- explicit discriminant
   end Incomplete5;

   task type Incomplete6 
     (D6 : Small_Int := 4) is                    -- unknown discriminant/
      entry Read_Int (P : out Small_Int);        -- explicit discriminant
   end Incomplete6;

end C3A1002_0;

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

package body C3A1002_0 is

   task body Incomplete5 is  
   begin
      select 
         accept Read_Disc (P : out Enu_Type) do  
            P := D5;
         end Read_Disc;
      or
         terminate;
      end select;

   end Incomplete5;

   ----------------------------------------------------------------------
   task body Incomplete6 is 
   begin
      select 
         accept Read_Int (P : out Small_Int) do  
            P := D6;
         end Read_Int;
      or
         terminate;
      end select;

   end Incomplete6;

end C3A1002_0;

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

with Report;

with C3A1002_0;
use  C3A1002_0;

procedure C3A1002 is

   Enum_Val : Enu_Type := M;

   Int_Val  : Small_Int := 15;

   -- Discriminant value comes from default.

   Incomplete6_Obj_1  :  Incomplete6;

   -- Discriminant value comes from explicit constraint.

   Incomplete1_Obj_1  :  Incomplete1 (M);

   Incomplete2_Obj_1  :  Incomplete2 (6);

   Incomplete5_Obj_1  :  Incomplete5 (F);

   Incomplete6_Obj_2  :  Incomplete6 (7);

   -- Discriminant value comes from assignment.        

   Incomplete1_Obj_2  :  Incomplete1
                      := (F, 12);

   Incomplete3_Obj_1  :  Incomplete3
                      := (D => 2, S => "Hi", I => 10, E => F);

   Incomplete4_Obj_1  :  Incomplete4
                      := (E => M, D => 3, S => "Bye", I => 14);

begin

   Report.Test ("C3A1002", "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 "   &
                "tagged records and task types");

   -- Check the initial values.

   if (Incomplete6_Obj_1.D6 /= 4) then 
      Report.Failed ("Wrong initial value for Incomplete6_Obj_1");
   end if;

   -- Check the explicit values.

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

   if (Incomplete2_Obj_1.D2       /= 6) or 
      (Incomplete2_Obj_1.FInteger /= 8) or
      (Incomplete2_Obj_1.ID       /= "ACVC95") then
         Report.Failed ("Wrong values for Incomplete2_Obj_1");
   end if;

   if (Incomplete5_Obj_1.D5 /= F) then 
      Report.Failed ("Wrong value for Incomplete5_Obj_1");
   end if;

   Incomplete5_Obj_1.Read_Disc (Enum_Val);

   if (Enum_Val /= F) then 
      Report.Failed ("Wrong value for Enum_Val");
   end if;

   if (Incomplete6_Obj_2.D6 /= 7) then 
      Report.Failed ("Wrong value for Incomplete6_Obj_2");
   end if;

   Incomplete6_Obj_1.Read_Int (Int_Val);

   if (Int_Val /= 4) then 
      Report.Failed ("Wrong value for Int_Val");
   end if;

   -- Check the assigned values.

   if (Incomplete1_Obj_2.D1       /= F)  or 
      (Incomplete1_Obj_2.FInteger /= 12) then
         Report.Failed ("Wrong values for Incomplete1_Obj_2");
   end if;

   if (Incomplete3_Obj_1.D /= 2 ) or 
      (Incomplete3_Obj_1.I /= 10) or
      (Incomplete3_Obj_1.E /= F ) or
      (Incomplete3_Obj_1.S /= "Hi") then
         Report.Failed ("Wrong values for Incomplete3_Obj_1");
   end if;

   if (Incomplete4_Obj_1.E /= M )      or 
      (Incomplete4_Obj_1.D /= 3)       or
      (Incomplete4_Obj_1.S /= "Bye")   or
      (Incomplete4_Obj_1.I /= 14)      then
         Report.Failed ("Wrong values for Incomplete4_Obj_1");
   end if;

   Report.Result;

end C3A1002;
