view gcc/testsuite/ada/acats/tests/c3/c390002.a @ 111:04ced10e8804

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

-- C390002.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 a tagged base type may be declared, and derived
--      from in simple, private and extended forms.  (Overlaps with C390B04)
--      Check that the package Ada.Tags is present and correctly implemented.
--      Check for the correct operation of Expanded_Name, External_Tag and
--      Internal_Tag within that package.  Check that the exception Tag_Error
--      is correctly raised on calling Internal_Tag with bad input.
--
-- TEST DESCRIPTION:
--      This test declares a tagged type, and derives three types from it.
--      These types are then used to test the presence and function of the
--      package Ada.Tags.
--
--
-- CHANGE HISTORY:
--      06 Dec 94   SAIC    ACVC 2.0
--      19 Dec 94   SAIC    Removed RM references from objective text.
--      27 Jan 96   SAIC    Update RM references for 2.1
--
--!

with Report;
with Ada.Tags;  

procedure C390002 is

  package Vehicle is

    type Object is tagged limited private;  -- ancestor type
    procedure Create( The_Vehicle : in out Object; Wheels : in Natural );
    function  Wheels( The_Vehicle : Object ) return Natural;

  private

    type Object is tagged limited record
      Wheel_Count : Natural := 0;
    end record;

  end Vehicle;

  package Motivators is

    type Bicycle is new Vehicle.Object with null record; -- simple 

    type Car is new Vehicle.Object with record           -- extended
      Convertible : Boolean;
    end record;

    type Truck is new Vehicle.Object with private;       -- private

  private

    type Truck is new Vehicle.Object with record
      Air_Horn : Boolean;
    end record;

  end Motivators;

  package body Vehicle is

    procedure Create( The_Vehicle : in out Object; Wheels : in Natural ) is
    begin
      The_Vehicle.Wheel_Count := Wheels;
    end Create;

    function  Wheels( The_Vehicle : Object ) return Natural is
    begin
      return The_Vehicle.Wheel_Count;
    end Wheels;

  end Vehicle;

  function TC_ID_Tag( Tag : in Ada.Tags.Tag ) return Ada.Tags.Tag is
  begin
    return Ada.Tags.Internal_Tag( Ada.Tags.External_Tag( Tag ) );
    Report.Comment("This message intentionally blank.");
  end TC_ID_Tag;

  procedure Check_Tags( Machine       : in Vehicle.Object'Class;
                        Expected_Name : in String;
                        External_Tag  : in String ) is
    The_Tag : constant Ada.Tags.Tag := Machine'Tag;
    use type Ada.Tags.Tag;
  begin
      if Ada.Tags.Expanded_Name(The_Tag) /= Expected_Name then  
         Report.Failed ("Failed in Check_Tags, Expanded_Name "
                        & Expected_Name);
      end if;
      if Ada.Tags.External_Tag(The_Tag) /= External_Tag then  
         Report.Failed ("Failed in Check_Tags, External_Tag "
                        & Expected_Name);
      end if;
      if Ada.Tags.Internal_Tag(External_Tag) /= The_Tag then
         Report.Failed ("Failed in Check_Tags, Internal_Tag "
                        & Expected_Name);
      end if;
  end Check_Tags;

  procedure Check_Exception is
    Boeing_777_Id : Ada.Tags.Tag;
  begin
    Boeing_777_Id := Ada.Tags.Internal_Tag("!@#$%^:*\/?"" not a tag!");
    Report.Failed ("Failed in Check_Exception, no exception");
    Boeing_777_Id := TC_ID_Tag( Boeing_777_Id ); 
  exception
    when Ada.Tags.Tag_Error => null;  
    when others =>
      Report.Failed ("Failed in Check_Exception, wrong exception");
  end Check_Exception;

  use Motivators;
  Two_Wheeler      : Bicycle;
  Four_Wheeler     : Car;
  Eighteen_Wheeler : Truck;

begin  -- Main test procedure.

    Report.Test ("C390002", "Check that a tagged type may be declared and " &
                 "derived from in simple, private and extended forms.  " &
                 "Check package Ada.Tags" );

    Create( Two_Wheeler,       2 );
    Create( Four_Wheeler,      4 );
    Create( Eighteen_Wheeler, 18 );
   
    Check_Tags( Machine       => Two_Wheeler, 
                Expected_Name => "C390002.MOTIVATORS.BICYCLE",
                External_Tag  => Bicycle'External_Tag );
    Check_Tags( Machine       => Four_Wheeler, 
                Expected_Name => "C390002.MOTIVATORS.CAR",
                External_Tag  => Car'External_Tag );
    Check_Tags( Machine       => Eighteen_Wheeler, 
                Expected_Name => "C390002.MOTIVATORS.TRUCK",
                External_Tag  => Truck'External_Tag );

    Check_Exception;
 
  Report.Result;

end C390002;