-- C432001.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 extension aggregates may be used to specify values -- for types that are record extensions. Check that the -- type of the ancestor expression may be any nonlimited type that -- is a record extension, including private types and private -- extensions. Check that the type for the aggregate is -- derived from the type of the ancestor expression. -- -- TEST DESCRIPTION: -- -- Two progenitor nonlimited record types are declared, one -- nonprivate and one private. Using these as parent types, -- all possible combinations of record extensions are declared -- (Nonprivate record extension of nonprivate type, private -- extension of nonprivate type, nonprivate record extension of -- private type, and private extension of private type). Finally, -- each of these types is extended using nonprivate record -- extensions. -- -- Extension of private types is done in packages other than -- the ones containing the parent declaration. This is done -- to eliminate errors with extension of the partial view of -- a type, which is not an objective of this test. -- -- All components of private types and private extensions are given -- default values. This eliminates the need for separate subprograms -- whose sole purpose is to place a value into a private record type. -- -- Types that have been extended are checked using an object of their -- parent type as the ancestor expression. For those types that -- have been extended twice, using only nonprivate record extensions, -- a check is made using an object of their grandparent type as -- the ancestor expression. -- -- For each type, a subprogram is defined which checks the contents -- of the parameter, which is a value of the record extension. -- Components of nonprivate record extensions are checked against -- passed-in parameters of the component type. Components of private -- extensions are checked to ensure that they maintain their initial -- values. -- -- To check that the aggregate's type is derived from its ancestor, -- each Check subprogram in turn calls the Check subprogram for -- its parent type. Explicit conversion is used to convert the -- record extension to the parent type. -- -- -- CHANGE HISTORY: -- 06 Dec 94 SAIC ACVC 2.0 -- --! with Report; package C432001_0 is type Eras is (Precambrian, Paleozoic, Mesozoic, Cenozoic); type N is tagged record How_Long_Ago : Natural := Report.Ident_Int(1); Era : Eras := Cenozoic; end record; function Check (Rec : in N; N : in Natural; E : in Eras) return Boolean; type P is tagged private; function Check (Rec : in P) return Boolean; private type P is tagged record How_Long_Ago : Natural := Report.Ident_Int(150); Era : Eras := Mesozoic; end record; end C432001_0; package body C432001_0 is function Check (Rec : in P) return Boolean is begin return Rec.How_Long_Ago = 150 and Rec.Era = Mesozoic; end Check; function Check (Rec : in N; N : in Natural; E : in Eras) return Boolean is begin return Rec.How_Long_Ago = N and Rec.Era = E; end Check; end C432001_0; with C432001_0; package C432001_1 is type Periods is (Aphebian, Helikian, Hadrynian, Cambrian, Ordovician, Silurian, Devonian, Carboniferous, Permian, Triassic, Jurassic, Cretaceous, Tertiary, Quaternary); type N_N is new C432001_0.N with record Period : Periods := C432001_1.Quaternary; end record; function Check (Rec : in N_N; N : in Natural; E : in C432001_0.Eras; P : in Periods) return Boolean; type N_P is new C432001_0.N with private; function Check (Rec : in N_P) return Boolean; type P_N is new C432001_0.P with record Period : Periods := C432001_1.Jurassic; end record; function Check (Rec : in P_N; P : in Periods) return Boolean; type P_P is new C432001_0.P with private; function Check (Rec : in P_P) return Boolean; type P_P_Null is new C432001_0.P with null record; private type N_P is new C432001_0.N with record Period : Periods := C432001_1.Quaternary; end record; type P_P is new C432001_0.P with record Period : Periods := C432001_1.Jurassic; end record; end C432001_1; with Report; package body C432001_1 is function Check (Rec : in N_N; N : in Natural; E : in C432001_0.Eras; P : in Periods) return Boolean is begin if not C432001_0.Check (C432001_0.N (Rec), N, E) then Report.Failed ("Conversion to parent type of " & "nonprivate portion of " & "nonprivate extension failed"); end if; return Rec.Period = P; end Check; function Check (Rec : in N_P) return Boolean is begin if not C432001_0.Check (C432001_0.N (Rec), 1, C432001_0.Cenozoic) then Report.Failed ("Conversion to parent type of " & "nonprivate portion of " & "private extension failed"); end if; return Rec.Period = C432001_1.Quaternary; end Check; function Check (Rec : in P_N; P : in Periods) return Boolean is begin if not C432001_0.Check (C432001_0.P (Rec)) then Report.Failed ("Conversion to parent type of " & "private portion of " & "nonprivate extension failed"); end if; return Rec.Period = P; end Check; function Check (Rec : in P_P) return Boolean is begin if not C432001_0.Check (C432001_0.P (Rec)) then Report.Failed ("Conversion to parent type of " & "private portion of " & "private extension failed"); end if; return Rec.Period = C432001_1.Jurassic; end Check; end C432001_1; with C432001_0; with C432001_1; package C432001_2 is -- All types herein are nonprivate extensions, since aggregates -- cannot be given for private extensions type N_N_N is new C432001_1.N_N with record Sample_On_Loan : Boolean; end record; function Check (Rec : in N_N_N; N : in Natural; E : in C432001_0.Eras; P : in C432001_1.Periods; B : in Boolean) return Boolean; type N_P_N is new C432001_1.N_P with record Sample_On_Loan : Boolean; end record; function Check (Rec : in N_P_N; B : Boolean) return Boolean; type P_N_N is new C432001_1.P_N with record Sample_On_Loan : Boolean; end record; function Check (Rec : in P_N_N; P : in C432001_1.Periods; B : Boolean) return Boolean; type P_P_N is new C432001_1.P_P with record Sample_On_Loan : Boolean; end record; function Check (Rec : in P_P_N; B : Boolean) return Boolean; end C432001_2; with Report; package body C432001_2 is -- direct access to operator use type C432001_1.Periods; function Check (Rec : in N_N_N; N : in Natural; E : in C432001_0.Eras; P : in C432001_1.Periods; B : in Boolean) return Boolean is begin if not C432001_1.Check (C432001_1.N_N (Rec), N, E, P) then Report.Failed ("Conversion to parent " & "nonprivate type extension " & "failed"); end if; return Rec.Sample_On_Loan = B; end Check; function Check (Rec : in N_P_N; B : Boolean) return Boolean is begin if not C432001_1.Check (C432001_1.N_P (Rec)) then Report.Failed ("Conversion to parent " & "private type extension " & "failed"); end if; return Rec.Sample_On_Loan = B; end Check; function Check (Rec : in P_N_N; P : in C432001_1.Periods; B : Boolean) return Boolean is begin if not C432001_1.Check (C432001_1.P_N (Rec), P) then Report.Failed ("Conversion to parent " & "nonprivate type extension " & "failed"); end if; return Rec.Sample_On_Loan = B; end Check; function Check (Rec : in P_P_N; B : Boolean) return Boolean is begin if not C432001_1.Check (C432001_1.P_P (Rec)) then Report.Failed ("Conversion to parent " & "private type extension " & "failed"); end if; return Rec.Sample_On_Loan = B; end Check; end C432001_2; with C432001_0; with C432001_1; with C432001_2; with Report; procedure C432001 is N_Object : C432001_0.N := (How_Long_Ago => Report.Ident_Int(375), Era => C432001_0.Paleozoic); P_Object : C432001_0.P; -- default value is (150, -- C432001_0.Mesozoic) N_N_Object : C432001_1.N_N := (N_Object with Period => C432001_1.Devonian); P_N_Object : C432001_1.P_N := (P_Object with Period => C432001_1.Jurassic); N_P_Object : C432001_1.N_P; -- default is (1, -- C432001_0.Cenozoic, -- C432001_1.Quaternary) P_P_Object : C432001_1.P_P; -- default is (150, -- C432001_0.Mesozoic, -- C432001_1.Jurassic) P_P_Null_Ob:C432001_1.P_P_Null := (P_Object with null record); N_N_N_Object : C432001_2.N_N_N := (N_N_Object with Sample_On_Loan => Report.Ident_Bool(True)); N_P_N_Object : C432001_2.N_P_N := (N_P_Object with Sample_On_Loan => Report.Ident_Bool(False)); P_N_N_Object : C432001_2.P_N_N := (P_N_Object with Sample_On_Loan => Report.Ident_Bool(True)); P_P_N_Object : C432001_2.P_P_N := (P_P_Object with Sample_On_Loan => Report.Ident_Bool(False)); P_N_Object_2 : C432001_1.P_N := (C432001_0.P(P_N_N_Object) with C432001_1.Carboniferous); N_N_Object_2 : C432001_1.N_N := (C432001_0.N'(42,C432001_0.Precambrian) with C432001_1.Carboniferous); begin Report.Test ("C432001", "Extension aggregates"); -- check ultimate ancestor types if not C432001_0.Check (N_Object, 375, C432001_0.Paleozoic) then Report.Failed ("Object of " & "nonprivate type " & "failed content check"); end if; if not C432001_0.Check (P_Object) then Report.Failed ("Object of " & "private type " & "failed content check"); end if; -- check direct type extensions if not C432001_1.Check (N_N_Object, 375, C432001_0.Paleozoic, C432001_1.Devonian) then Report.Failed ("Object of " & "nonprivate extension of nonprivate type " & "failed content check"); end if; if not C432001_1.Check (N_P_Object) then Report.Failed ("Object of " & "private extension of nonprivate type " & "failed content check"); end if; if not C432001_1.Check (P_N_Object, C432001_1.Jurassic) then Report.Failed ("Object of " & "nonprivate extension of private type " & "failed content check"); end if; if not C432001_1.Check (P_P_Object) then Report.Failed ("Object of " & "private extension of private type " & "failed content check"); end if; if not C432001_1.Check (P_P_Null_Ob) then Report.Failed ("Object of " & "private type " & "failed content check"); end if; -- check direct extensions of extensions if not C432001_2.Check (N_N_N_Object, 375, C432001_0.Paleozoic, C432001_1.Devonian, True) then Report.Failed ("Object of " & "nonprivate extension of nonprivate extension " & "(of nonprivate parent) " & "failed content check"); end if; if not C432001_2.Check (N_P_N_Object, False) then Report.Failed ("Object of " & "nonprivate extension of private extension " & "(of nonprivate parent) " & "failed content check"); end if; if not C432001_2.Check (P_N_N_Object, C432001_1.Jurassic, True) then Report.Failed ("Object of " & "nonprivate extension of nonprivate extension " & "(of private parent) " & "failed content check"); end if; if not C432001_2.Check (P_P_N_Object, False) then Report.Failed ("Object of " & "nonprivate extension of private extension " & "(of private parent) " & "failed content check"); end if; -- check that the extension aggregate may specify an expression of -- a "grandparent" ancestor type -- types tested are derived through nonprivate extensions only -- (extension aggregates are not allowed if the path from the -- ancestor type wanders through a private extension) N_N_N_Object := (N_Object with Period => C432001_1.Devonian, Sample_On_Loan => Report.Ident_Bool(True)); if not C432001_2.Check (N_N_N_Object, 375, C432001_0.Paleozoic, C432001_1.Devonian, True) then Report.Failed ("Object of " & "nonprivate extension " & "of nonprivate ancestor " & "failed content check"); end if; P_N_N_Object := (P_Object with Period => C432001_1.Jurassic, Sample_On_Loan => Report.Ident_Bool(True)); if not C432001_2.Check (P_N_N_Object, C432001_1.Jurassic, True) then Report.Failed ("Object of " & "nonprivate extension " & "of private ancestor " & "failed content check"); end if; -- Check additional cases if not C432001_1.Check (P_N_Object_2, C432001_1.Carboniferous) then Report.Failed ("Additional Object of " & "nonprivate extension of private type " & "failed content check"); end if; if not C432001_1.Check (N_N_Object_2, 42, C432001_0.Precambrian, C432001_1.Carboniferous) then Report.Failed ("Additional Object of " & "nonprivate extension of nonprivate type " & "failed content check"); end if; Report.Result; end C432001;