blob: 5de821b3052e41b0dd5794a8241d6237bc3e9cc1 [file] [log] [blame]
-- C432002.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 if an extension aggregate specifies a value for a record
-- extension and the ancestor expression has discriminants that are
-- inherited by the record extension, then a check is made that each
-- discriminant has the value specified.
--
-- Check that if an extension aggregate specifies a value for a record
-- extension and the ancestor expression has discriminants that are not
-- inherited by the record extension, then a check is made that each
-- such discriminant has the value specified for the corresponding
-- discriminant.
--
-- Check that the corresponding discriminant value may be specified
-- in the record component association list or in the derived type
-- definition for an ancestor.
--
-- Check the case of ancestors that are several generations removed.
-- Check the case where the value of the discriminant(s) in question
-- is supplied several generations removed.
--
-- Check the case of multiple discriminants.
--
-- Check that Constraint_Error is raised if the check fails.
--
-- TEST DESCRIPTION:
-- A hierarchy of tagged types is declared from a discriminated
-- root type. Each level declares two kinds of types: (1) a type
-- extension which constrains the discriminant of its parent to
-- the value of an expression and (2) a type extension that
-- constrains the discriminant of its parent to equal a new discriminant
-- of the type extension (These are the two categories of noninherited
-- discriminants).
--
-- Values for each type are declared within nested blocks. This is
-- done so that the instances that produce Constraint_Error may
-- be dealt with cleanly without forcing the program to exit.
--
-- Success and failure cases (which should raise Constraint_Error)
-- are set up for each kind of type. Additionally, for the first
-- level of the hierarchy, separate tests are done for ancestor
-- expressions specified by aggregates and those specified by
-- variables. Later tests are performed using variables only.
--
-- Additionally, the cases tested consist of the following kinds of
-- types:
--
-- Extensions of extensions, using both the parent and grandparent
-- types for the ancestor expression,
--
-- Ancestor expressions which are several generations removed
-- from the type of the aggregate,
--
-- Extensions of types with multiple discriminants, where the
-- extension declares a new discriminant which corresponds to
-- more than one discriminant of the ancestor types.
--
--
--
-- CHANGE HISTORY:
-- 06 Dec 94 SAIC ACVC 2.0
-- 19 Dec 94 SAIC Removed RM references from objective text.
-- 20 Dec 94 SAIC Repair confusion WRT overridden discriminants
--
--!
package C432002_0 is
subtype Length is Natural range 0..256;
type Discriminant (L : Length) is tagged
record
S1 : String (1..L);
end record;
procedure Do_Something (Rec : in out Discriminant);
-- inherited by all type extensions
-- Aggregates of Discriminant are of the form
-- (L, S1) where L= S1'Length
-- Discriminant of parent constrained to value of an expression
type Constrained_Discriminant_Extension is
new Discriminant (L => 10)
with record
S2 : String (1..20);
end record;
-- Aggregates of Constrained_Discriminant_Extension are of the form
-- (L, S1, S2), where L = S1'Length = 10, S2'Length = 20
type Once_Removed is new Constrained_Discriminant_Extension
with record
S3 : String (1..3);
end record;
type Twice_Removed is new Once_Removed
with record
S4 : String (1..8);
end record;
-- Aggregates of Twice_Removed are of the form
-- (L, S1, S2, S3, S4), where L = S1'Length = 10,
-- S2'Length = 20,
-- S3'Length = 3,
-- S4'Length = 8
-- Discriminant of parent constrained to equal new discriminant
type New_Discriminant_Extension (N : Length) is
new Discriminant (L => N) with
record
S2 : String (1..N);
end record;
-- Aggregates of New_Discriminant_Extension are of the form
-- (N, S1, S2), where N = S1'Length = S2'Length
-- Discriminant of parent extension constrained to the value of
-- an expression
type Constrained_Extension_Extension is
new New_Discriminant_Extension (N => 20)
with record
S3 : String (1..5);
end record;
-- Aggregates of Constrained_Extension_Extension are of the form
-- (N, S1, S2, S3), where N = S1'Length = S2'Length = 20,
-- S3'Length = 5
-- Discriminant of parent extension constrained to equal a new
-- discriminant
type New_Extension_Extension (I : Length) is
new New_Discriminant_Extension (N => I)
with record
S3 : String (1..I);
end record;
-- Aggregates of New_Extension_Extension are of the form
-- (I, S1, 2, S3), where
-- I = S1'Length = S2'Length = S3'Length
type Multiple_Discriminants (A, B : Length) is tagged
record
S1 : String (1..A);
S2 : String (1..B);
end record;
procedure Do_Something (Rec : in out Multiple_Discriminants);
-- inherited by type extension
-- Aggregates of Multiple_Discriminants are of the form
-- (A, B, S1, S2), where A = S1'Length, B = S2'Length
type Multiple_Discriminant_Extension (C : Length) is
new Multiple_Discriminants (A => C, B => C)
with record
S3 : String (1..C);
end record;
-- Aggregates of Multiple_Discriminant_Extension are of the form
-- (A, B, S1, S2, C, S3), where
-- A = B = C = S1'Length = S2'Length = S3'Length
end C432002_0;
with Report;
package body C432002_0 is
S : String (1..20) := "12345678901234567890";
procedure Do_Something (Rec : in out Discriminant) is
begin
Rec.S1 := Report.Ident_Str (S (1..Rec.L));
end Do_Something;
procedure Do_Something (Rec : in out Multiple_Discriminants) is
begin
Rec.S1 := Report.Ident_Str (S (1..Rec.A));
end Do_Something;
end C432002_0;
with C432002_0;
with Report;
procedure C432002 is
-- Various different-sized strings for variety
String_3 : String (1..3) := Report.Ident_Str("123");
String_5 : String (1..5) := Report.Ident_Str("12345");
String_8 : String (1..8) := Report.Ident_Str("12345678");
String_10 : String (1..10) := Report.Ident_Str("1234567890");
String_11 : String (1..11) := Report.Ident_Str("12345678901");
String_20 : String (1..20) := Report.Ident_Str("12345678901234567890");
begin
Report.Test ("C432002",
"Extension aggregates for discriminated types");
--------------------------------------------------------------------
-- Extension constrains parent's discriminant to value of expression
--------------------------------------------------------------------
-- Successful cases - value matches corresponding discriminant value
CD_Matched_Aggregate:
begin
declare
CD : C432002_0.Constrained_Discriminant_Extension :=
(C432002_0.Discriminant'(L => 10,
S1 => String_10)
with S2 => String_20);
begin
C432002_0.Do_Something(CD); -- success
end;
exception
when Constraint_Error =>
Report.Comment ("Ancestor expression is an aggregate");
Report.Failed ("Aggregate of extension " &
"with discriminant constrained: " &
"Constraint_Error was incorrectly raised " &
"for value that matches corresponding " &
"discriminant");
end CD_Matched_Aggregate;
CD_Matched_Variable:
begin
declare
D : C432002_0.Discriminant(L => 10) :=
C432002_0.Discriminant'(L => 10,
S1 => String_10);
CD : C432002_0.Constrained_Discriminant_Extension :=
(D with S2 => String_20);
begin
C432002_0.Do_Something(CD); -- success
end;
exception
when Constraint_Error =>
Report.Comment ("Ancestor expression is a variable");
Report.Failed ("Aggregate of extension " &
"with discriminant constrained: " &
"Constraint_Error was incorrectly raised " &
"for value that matches corresponding " &
"discriminant");
end CD_Matched_Variable;
-- Unsuccessful cases - value does not match value of corresponding
-- discriminant. Constraint_Error should be
-- raised.
CD_Unmatched_Aggregate:
begin
declare
CD : C432002_0.Constrained_Discriminant_Extension :=
(C432002_0.Discriminant'(L => 5,
S1 => String_5)
with S2 => String_20);
begin
Report.Comment ("Ancestor expression is an aggregate");
Report.Failed ("Aggregate of extension " &
"with discriminant constrained: " &
"Constraint_Error was not raised " &
"for discriminant value that does not match " &
"corresponding discriminant");
C432002_0.Do_Something(CD); -- disallow unused var optimization
end;
exception
when Constraint_Error =>
null; -- raise of Constraint_Error is expected
end CD_Unmatched_Aggregate;
CD_Unmatched_Variable:
begin
declare
D : C432002_0.Discriminant(L => 5) :=
C432002_0.Discriminant'(L => 5,
S1 => String_5);
CD : C432002_0.Constrained_Discriminant_Extension :=
(D with S2 => String_20);
begin
Report.Comment ("Ancestor expression is an variable");
Report.Failed ("Aggregate of extension " &
"with discriminant constrained: " &
"Constraint_Error was not raised " &
"for discriminant value that does not match " &
"corresponding discriminant");
C432002_0.Do_Something(CD); -- disallow unused var optimization
end;
exception
when Constraint_Error =>
null; -- raise of Constraint_Error is expected
end CD_Unmatched_Variable;
-----------------------------------------------------------------------
-- Extension constrains parent's discriminant to equal new discriminant
-----------------------------------------------------------------------
-- Successful cases - value matches corresponding discriminant value
ND_Matched_Aggregate:
begin
declare
ND : C432002_0.New_Discriminant_Extension (N => 8) :=
(C432002_0.Discriminant'(L => 8,
S1 => String_8)
with N => 8,
S2 => String_8);
begin
C432002_0.Do_Something(ND); -- success
end;
exception
when Constraint_Error =>
Report.Comment ("Ancestor expression is an aggregate");
Report.Failed ("Aggregate of extension " &
"with new discriminant: " &
"Constraint_Error was incorrectly raised " &
"for value that matches corresponding " &
"discriminant");
end ND_Matched_Aggregate;
ND_Matched_Variable:
begin
declare
D : C432002_0.Discriminant(L => 3) :=
C432002_0.Discriminant'(L => 3,
S1 => String_3);
ND : C432002_0.New_Discriminant_Extension (N => 3) :=
(D with N => 3,
S2 => String_3);
begin
C432002_0.Do_Something(ND); -- success
end;
exception
when Constraint_Error =>
Report.Comment ("Ancestor expression is an variable");
Report.Failed ("Aggregate of extension " &
"with new discriminant: " &
"Constraint_Error was incorrectly raised " &
"for value that matches corresponding " &
"discriminant");
end ND_Matched_Variable;
-- Unsuccessful cases - value does not match value of corresponding
-- discriminant. Constraint_Error should be
-- raised.
ND_Unmatched_Aggregate:
begin
declare
ND : C432002_0.New_Discriminant_Extension (N => 20) :=
(C432002_0.Discriminant'(L => 11,
S1 => String_11)
with N => 20,
S2 => String_20);
begin
Report.Comment ("Ancestor expression is an aggregate");
Report.Failed ("Aggregate of extension " &
"with new discriminant: " &
"Constraint_Error was not raised " &
"for discriminant value that does not match " &
"corresponding discriminant");
C432002_0.Do_Something(ND); -- disallow unused var optimization
end;
exception
when Constraint_Error =>
null; -- raise is expected
end ND_Unmatched_Aggregate;
ND_Unmatched_Variable:
begin
declare
D : C432002_0.Discriminant(L => 5) :=
C432002_0.Discriminant'(L => 5,
S1 => String_5);
ND : C432002_0.New_Discriminant_Extension (N => 20) :=
(D with N => 20,
S2 => String_20);
begin
Report.Comment ("Ancestor expression is an variable");
Report.Failed ("Aggregate of extension " &
"with new discriminant: " &
"Constraint_Error was not raised " &
"for discriminant value that does not match " &
"corresponding discriminant");
C432002_0.Do_Something(ND); -- disallow unused var optimization
end;
exception
when Constraint_Error =>
null; -- raise is expected
end ND_Unmatched_Variable;
--------------------------------------------------------------------
-- Extension constrains parent's discriminant to value of expression
-- Parent is a discriminant extension
--------------------------------------------------------------------
-- Successful cases - value matches corresponding discriminant value
CE_Matched_Aggregate:
begin
declare
CE : C432002_0.Constrained_Extension_Extension :=
(C432002_0.Discriminant'(L => 20,
S1 => String_20)
with N => 20,
S2 => String_20,
S3 => String_5);
begin
C432002_0.Do_Something(CE); -- success
end;
exception
when Constraint_Error =>
Report.Comment ("Ancestor expression is an aggregate");
Report.Failed ("Aggregate of extension (of extension) " &
"with discriminant constrained: " &
"Constraint_Error was incorrectly raised " &
"for value that matches corresponding " &
"discriminant");
end CE_Matched_Aggregate;
CE_Matched_Variable:
begin
declare
ND : C432002_0.New_Discriminant_Extension (N => 20) :=
C432002_0.New_Discriminant_Extension'
(N => 20,
S1 => String_20,
S2 => String_20);
CE : C432002_0.Constrained_Extension_Extension :=
(ND with S3 => String_5);
begin
C432002_0.Do_Something(CE); -- success
end;
exception
when Constraint_Error =>
Report.Comment ("Ancestor expression is a variable");
Report.Failed ("Aggregate of extension (of extension) " &
"with discriminant constrained: " &
"Constraint_Error was incorrectly raised " &
"for value that matches corresponding " &
"discriminant");
end CE_Matched_Variable;
-- Unsuccessful cases - value does not match value of corresponding
-- discriminant. Constraint_Error should be
-- raised.
CE_Unmatched_Aggregate:
begin
declare
CE : C432002_0.Constrained_Extension_Extension :=
(C432002_0.New_Discriminant_Extension'
(N => 11,
S1 => String_11,
S2 => String_11)
with S3 => String_5);
begin
Report.Comment ("Ancestor expression is an aggregate");
Report.Failed ("Aggregate of extension (of extension) " &
"Constraint_Error was not raised " &
"with discriminant constrained: " &
"for discriminant value that does not match " &
"corresponding discriminant");
C432002_0.Do_Something(CE); -- disallow unused var optimization
end;
exception
when Constraint_Error =>
null; -- raise of Constraint_Error is expected
end CE_Unmatched_Aggregate;
CE_Unmatched_Variable:
begin
declare
D : C432002_0.Discriminant(L => 8) :=
C432002_0.Discriminant'(L => 8,
S1 => String_8);
CE : C432002_0.Constrained_Extension_Extension :=
(D with N => 8,
S2 => String_8,
S3 => String_5);
begin
Report.Comment ("Ancestor expression is a variable");
Report.Failed ("Aggregate of extension (of extension) " &
"with discriminant constrained: " &
"Constraint_Error was not raised " &
"for discriminant value that does not match " &
"corresponding discriminant");
C432002_0.Do_Something(CE); -- disallow unused var optimization
end;
exception
when Constraint_Error =>
null; -- raise of Constraint_Error is expected
end CE_Unmatched_Variable;
-----------------------------------------------------------------------
-- Extension constrains parent's discriminant to equal new discriminant
-- Parent is a discriminant extension
-----------------------------------------------------------------------
-- Successful cases - value matches corresponding discriminant value
NE_Matched_Aggregate:
begin
declare
NE : C432002_0.New_Extension_Extension (I => 8) :=
(C432002_0.Discriminant'(L => 8,
S1 => String_8)
with I => 8,
S2 => String_8,
S3 => String_8);
begin
C432002_0.Do_Something(NE); -- success
end;
exception
when Constraint_Error =>
Report.Comment ("Ancestor expression is an aggregate");
Report.Failed ("Aggregate of extension (of extension) " &
"with new discriminant: " &
"Constraint_Error was incorrectly raised " &
"for value that matches corresponding " &
"discriminant");
end NE_Matched_Aggregate;
NE_Matched_Variable:
begin
declare
ND : C432002_0.New_Discriminant_Extension (N => 3) :=
C432002_0.New_Discriminant_Extension'
(N => 3,
S1 => String_3,
S2 => String_3);
NE : C432002_0.New_Extension_Extension (I => 3) :=
(ND with I => 3,
S3 => String_3);
begin
C432002_0.Do_Something(NE); -- success
end;
exception
when Constraint_Error =>
Report.Comment ("Ancestor expression is a variable");
Report.Failed ("Aggregate of extension (of extension) " &
"with new discriminant: " &
"Constraint_Error was incorrectly raised " &
"for value that matches corresponding " &
"discriminant");
end NE_Matched_Variable;
-- Unsuccessful cases - value does not match value of corresponding
-- discriminant. Constraint_Error should be
-- raised.
NE_Unmatched_Aggregate:
begin
declare
NE : C432002_0.New_Extension_Extension (I => 8) :=
(C432002_0.New_Discriminant_Extension'
(C432002_0.Discriminant'(L => 11,
S1 => String_11)
with N => 11,
S2 => String_11)
with I => 8,
S3 => String_8);
begin
Report.Comment ("Ancestor expression is an extension aggregate");
Report.Failed ("Aggregate of extension (of extension) " &
"with new discriminant: " &
"Constraint_Error was not raised " &
"for discriminant value that does not match " &
"corresponding discriminant");
C432002_0.Do_Something(NE); -- disallow unused var optimization
end;
exception
when Constraint_Error =>
null; -- raise is expected
end NE_Unmatched_Aggregate;
NE_Unmatched_Variable:
begin
declare
D : C432002_0.Discriminant(L => 5) :=
C432002_0.Discriminant'(L => 5,
S1 => String_5);
NE : C432002_0.New_Extension_Extension (I => 20) :=
(D with I => 5,
S2 => String_5,
S3 => String_20);
begin
Report.Comment ("Ancestor expression is a variable");
Report.Failed ("Aggregate of extension (of extension) " &
"with new discriminant: " &
"Constraint_Error was not raised " &
"for discriminant value that does not match " &
"corresponding discriminant");
C432002_0.Do_Something(NE); -- disallow unused var optimization
end;
exception
when Constraint_Error =>
null; -- raise is expected
end NE_Unmatched_Variable;
-----------------------------------------------------------------------
-- Corresponding discriminant is two levels deeper than aggregate
-----------------------------------------------------------------------
-- Successful case - value matches corresponding discriminant value
TR_Matched_Variable:
begin
declare
D : C432002_0.Discriminant (L => 10) :=
C432002_0.Discriminant'(L => 10,
S1 => String_10);
TR : C432002_0.Twice_Removed :=
C432002_0.Twice_Removed'(D with S2 => String_20,
S3 => String_3,
S4 => String_8);
-- N is constrained to a value in the derived_type_definition
-- of Constrained_Discriminant_Extension. Its omission from
-- the above record_component_association_list is allowed by
-- 4.3.2(6).
begin
C432002_0.Do_Something(TR); -- success
end;
exception
when Constraint_Error =>
Report.Failed ("Aggregate of far-removed extension " &
"with discriminant constrained: " &
"Constraint_Error was incorrectly raised " &
"for value that matches corresponding " &
"discriminant");
end TR_Matched_Variable;
-- Unsuccessful case - value does not match value of corresponding
-- discriminant. Constraint_Error should be
-- raised.
TR_Unmatched_Variable:
begin
declare
D : C432002_0.Discriminant (L => 5) :=
C432002_0.Discriminant'(L => 5,
S1 => String_5);
TR : C432002_0.Twice_Removed :=
C432002_0.Twice_Removed'(D with S2 => String_20,
S3 => String_3,
S4 => String_8);
begin
Report.Failed ("Aggregate of far-removed extension " &
"with discriminant constrained: " &
"Constraint_Error was not raised " &
"for discriminant value that does not match " &
"corresponding discriminant");
C432002_0.Do_Something(TR); -- disallow unused var optimization
end;
exception
when Constraint_Error =>
null; -- raise is expected
end TR_Unmatched_Variable;
------------------------------------------------------------------------
-- Parent has multiple discriminants.
-- Discriminant in extension corresponds to both parental discriminants.
------------------------------------------------------------------------
-- Successful case - value matches corresponding discriminant value
MD_Matched_Variable:
begin
declare
MD : C432002_0.Multiple_Discriminants (A => 10, B => 10) :=
C432002_0.Multiple_Discriminants'(A => 10,
B => 10,
S1 => String_10,
S2 => String_10);
MDE : C432002_0.Multiple_Discriminant_Extension (C => 10) :=
(MD with C => 10,
S3 => String_10);
begin
C432002_0.Do_Something(MDE); -- success
end;
exception
when Constraint_Error =>
Report.Failed ("Aggregate of extension " &
"of multiply-discriminated parent: " &
"Constraint_Error was incorrectly raised " &
"for value that matches corresponding " &
"discriminant");
end MD_Matched_Variable;
-- Unsuccessful case - value does not match value of corresponding
-- discriminant. Constraint_Error should be
-- raised.
MD_Unmatched_Variable:
begin
declare
MD : C432002_0.Multiple_Discriminants (A => 10, B => 8) :=
C432002_0.Multiple_Discriminants'(A => 10,
B => 8,
S1 => String_10,
S2 => String_8);
MDE : C432002_0.Multiple_Discriminant_Extension (C => 10) :=
(MD with C => 10,
S3 => String_10);
begin
Report.Failed ("Aggregate of extension " &
"of multiply-discriminated parent: " &
"Constraint_Error was not raised " &
"for discriminant value that does not match " &
"corresponding discriminant");
C432002_0.Do_Something(MDE); -- disallow unused var optimization
end;
exception
when Constraint_Error =>
null; -- raise is expected
end MD_Unmatched_Variable;
Report.Result;
end C432002;