view gcc/testsuite/ada/acats/tests/c9/c910003.a @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children
line wrap: on
line source

-- C910003.A
--
--                             Grant of Unlimited Rights
--
--     Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687 and
--     F08630-91-C-0015, 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 task discriminants that have an access subtype may be
--      dereferenced.
--
--      Note that discriminants in Ada 83 never can be dereferenced with
--      selection or indexing, as they cannot have an access type.
--
-- TEST DESCRIPTION:
--      A protected object is defined to create a simple buffer.
--      Two task types are defined, one to put values into the buffer,
--      and one to remove them. The tasks are passed a buffer object as
--      a discriminant with an access subtype. The producer task type includes
--      a discriminant to determine the values to product. The consumer task
--      type includes a value to save the results.
--      Two producer and one consumer tasks are declared, and the results
--      are checked.
--
-- CHANGE HISTORY:
--      10 Mar 99   RLB    Created test.
--
--!

package C910003_Pack is

    type Item_Type is range 1 .. 100; -- In a real application, this probably
                                      -- would be a record type.

    type Item_Array is array (Positive range <>) of Item_Type;

    protected type Buffer is
       entry Put (Item  : in Item_Type);
       entry Get (Item  : out Item_Type);
       function TC_Items_Buffered return Item_Array;
    private
       Saved_Item : Item_Type;
       Empty : Boolean := True;
       TC_Items : Item_Array (1 .. 10);
       TC_Last  : Natural := 0;
    end Buffer;

    type Buffer_Access_Type is access Buffer;

    PRODUCE_COUNT : constant := 2; -- Number of items to produce.

    task type Producer (Buffer_Access : Buffer_Access_Type;
                        Start_At : Item_Type);
        -- Produces PRODUCE_COUNT items. Starts when activated.

    type TC_Item_Array_Access_Type is access Item_Array (1 .. PRODUCE_COUNT*2);

    task type Consumer (Buffer_Access : Buffer_Access_Type;
                        Results : TC_Item_Array_Access_Type) is
        -- Stores PRODUCE_COUNT*2 items consumed in Results. Starts when
        -- activated.
        entry Wait_until_Done;
    end Consumer;

end C910003_Pack;


with Report;
package body C910003_Pack is

    protected body Buffer is
       entry Put (Item  : in Item_Type) when Empty is
       begin
           Empty := False;
           Saved_Item := Item;
           TC_Last := TC_Last + 1;
           TC_Items(TC_Last) := Item;
       end Put;

       entry Get (Item  : out Item_Type) when not Empty is
       begin
           Empty := True;
           Item := Saved_Item;
       end Get;

       function TC_Items_Buffered return Item_Array is
       begin
           return TC_Items(1..TC_Last);
       end TC_Items_Buffered;

    end Buffer;


    task body Producer is
        -- Produces PRODUCE_COUNT items. Starts when activated.
    begin
        for I in 1 .. Report.Ident_Int(PRODUCE_COUNT) loop
           Buffer_Access.Put (Start_At + (Item_Type(I)-1)*2);
        end loop;
    end Producer;


    task body Consumer is
        -- Stores PRODUCE_COUNT*2 items consumed in Results. Starts when
        -- activated.
    begin
        for I in 1 .. Report.Ident_Int(PRODUCE_COUNT*2) loop
            Buffer_Access.Get (Results (I));
            -- Buffer_Access and Results are both dereferenced.
        end loop;

        -- Check the results (and function call with a prefix dereference).
        if Results.all(Report.Ident_Int(1)) /= Buffer_Access.all.TC_Items_Buffered(Report.Ident_Int(1)) then
           Report.Failed ("First item mismatch");
        end if;
        if Results(Report.Ident_Int(2)) /= Buffer_Access.TC_Items_Buffered(Report.Ident_Int(2)) then
           Report.Failed ("Second item mismatch");
        end if;
        accept Wait_until_Done; -- Tell main that we're done.
    end Consumer;

end C910003_Pack;


with Report;
with C910003_Pack;

procedure C910003 is

begin -- C910003

   Report.Test ("C910003", "Check that tasks discriminants of access types can be dereferenced");


   declare     -- encapsulate the test

      Buffer_Access : C910003_Pack.Buffer_Access_Type :=
         new C910003_Pack.Buffer;

      TC_Results : C910003_Pack.TC_Item_Array_Access_Type :=
         new C910003_Pack.Item_Array (1 .. C910003_Pack.PRODUCE_COUNT*2);

      Producer_1 : C910003_Pack.Producer (Buffer_Access, 12);
      Producer_2 : C910003_Pack.Producer (Buffer_Access, 23);

      Consumer : C910003_Pack.Consumer (Buffer_Access, TC_Results);

      use type C910003_Pack.Item_Array; -- For /=.

   begin
      Consumer.Wait_until_Done;
      if TC_Results.all /= Buffer_Access.TC_Items_Buffered then
           Report.Failed ("Different items buffered than returned - Main");
      end if;
      if (TC_Results.all /= (12, 14, 23, 25) and
          TC_Results.all /= (12, 23, 14, 25) and
          TC_Results.all /= (12, 23, 25, 14) and
          TC_Results.all /= (23, 12, 14, 25) and
          TC_Results.all /= (23, 12, 25, 14) and
          TC_Results.all /= (23, 25, 12, 14)) then
          -- Above are the only legal results.
           Report.Failed ("Wrong results");
      end if;
   end;     -- encapsulation

   Report.Result;

end C910003;