-- C390011.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 tagged types declared within generic package declarations -- generate distinct tags for each instance of the generic. -- -- TEST DESCRIPTION: -- This test defines a very simple generic package (with the expectation -- that it should be easily be shared), and a few instances of that -- package. In true user-like fashion, two of the instances are identical -- (to wit: IIO is new Integer_IO(Integer)). The tags generated for each -- of them are placed into a list. The last action of the test is to -- check that everything in the list is unique. -- -- Almost as an aside, this test defines functions that return T'Base and -- T'Class, and then exercises these functions. -- -- (JPR) persistent objects really need a function like: -- function Get_Object return T'class; -- -- -- CHANGE HISTORY: -- 20 OCT 95 SAIC Initial version -- 23 APR 96 SAIC Commentary Corrections 2.1 -- --! ----------------------------------------------------------------- C390011_0 with Ada.Tags; package C390011_0 is procedure Add_Tag_To_List( T : Ada.Tags.Tag; X_Name, X_Tag: String ); procedure Check_List_For_Duplicates; end C390011_0; -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- with Report; package body C390011_0 is use type Ada.Tags.Tag; type SP is access String; type List_Item; type List_P is access List_Item; type List_Item is record The_Tag : Ada.Tags.Tag; Exp_Name : SP; Ext_Tag : SP; Next : List_P; end record; The_List : List_P; procedure Add_Tag_To_List ( T : Ada.Tags.Tag; X_Name, X_Tag: String ) is begin -- prepend the tag information to the list The_List := new List_Item'( The_Tag => T, Exp_Name => new String'(X_Name), Ext_Tag => new String'(X_Tag), Next => The_List ); end Add_Tag_To_List; procedure Check_List_For_Duplicates is Finger : List_P; Thumb : List_P := The_List; begin -- while Thumb /= null loop Finger := Thumb.Next; while Finger /= null loop -- Check that the tag is unique if Finger.The_Tag = Thumb.The_Tag then Report.Failed("Duplicate Tag"); end if; -- Check that the Expanded name is unique if Finger.Exp_Name.all = Thumb.Exp_Name.all then Report.Failed("Tag name " & Finger.Exp_Name.all & " repeats"); end if; -- Check that the External Tag is unique if Finger.Ext_Tag.all = Thumb.Ext_Tag.all then Report.Failed("External Tag " & Finger.Ext_Tag.all & " repeats"); end if; Finger := Finger.Next; end loop; Thumb := Thumb.Next; end loop; end Check_List_For_Duplicates; begin -- some things I just don't trust... if The_List /= null then Report.Failed("Implicit default for The_List not null"); end if; end C390011_0; ----------------------------------------------------------------- C390011_1 generic type Index is (<>); type Item is private; package C390011_1 is type List is array(Index range <>) of Item; type ListP is access all List; type Table is tagged record Data: ListP; end record; function Sort( T: in Table'Class ) return Table'Class; function Stable_Table return Table'Class; function Table_End( T: Table ) return Index'Base; end C390011_1; -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- package body C390011_1 is -- In a user program this package would DO something function Sort( T: in Table'Class ) return Table'Class is begin return T; end Sort; Empty : Table'Class := Table'( Data => null ); function Stable_Table return Table'Class is begin return Empty; end Stable_Table; function Table_End( T: Table ) return Index'Base is begin return Index'Base( T.Data.all'Last ); end Table_End; end C390011_1; ----------------------------------------------------------------- C390011_2 with C390011_1; package C390011_2 is new C390011_1( Index => Character, Item => Float ); ----------------------------------------------------------------- C390011_3 with C390011_1; package C390011_3 is new C390011_1( Index => Character, Item => Float ); ----------------------------------------------------------------- C390011_4 with C390011_1; package C390011_4 is new C390011_1( Index => Integer, Item => Character ); ----------------------------------------------------------------- C390011_5 with C390011_3; with C390011_4; package C390011_5 is type Table_3 is new C390011_3.Table with record Serial_Number : Integer; end record; type Table_4 is new C390011_4.Table with record Serial_Number : Integer; end record; end C390011_5; -- no package body C390011_5 required ------------------------------------------------------------------- C390011 with Report; with C390011_0; with C390011_2; with C390011_3; with C390011_4; with C390011_5; with Ada.Tags; procedure C390011 is begin -- Main test procedure. Report.Test ("C390011", "Check that tagged types declared within " & "generic package declarations generate distinct " & "tags for each instance of the generic. " & "Check that 'Base may be used as a subtype mark. " & "Check that T'Base and T'Class are allowed as " & "the subtype mark in a function result" ); -- build the tag information table C390011_0.Add_Tag_To_List(T => C390011_2.Table'Tag, X_Name => Ada.Tags.Expanded_Name(C390011_2.Table'Tag), X_Tag => Ada.Tags.External_Tag(C390011_2.Table'Tag) ); C390011_0.Add_Tag_To_List(T => C390011_3.Table'Tag, X_Name => Ada.Tags.Expanded_Name(C390011_3.Table'Tag), X_Tag => Ada.Tags.External_Tag(C390011_3.Table'Tag) ); C390011_0.Add_Tag_To_List(T => C390011_4.Table'Tag, X_Name => Ada.Tags.Expanded_Name(C390011_4.Table'Tag), X_Tag => Ada.Tags.External_Tag(C390011_4.Table'Tag) ); C390011_0.Add_Tag_To_List(T => C390011_5.Table_3'Tag, X_Name => Ada.Tags.Expanded_Name(C390011_5.Table_3'Tag), X_Tag => Ada.Tags.External_Tag(C390011_5.Table_3'Tag) ); C390011_0.Add_Tag_To_List(T => C390011_5.Table_4'Tag, X_Name => Ada.Tags.Expanded_Name(C390011_5.Table_4'Tag), X_Tag => Ada.Tags.External_Tag(C390011_5.Table_4'Tag) ); -- preform the check for distinct tags C390011_0.Check_List_For_Duplicates; Report.Result; end C390011;