blob: 0cbeeb46f633d5ce2925af2cd2941f4297dc3079 [file] [log] [blame]
-- CC51B03.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 the attribute S'Definite, where S is an indefinite formal
-- private or derived type, returns true if the actual corresponding to
-- S is definite, and returns false otherwise.
--
-- TEST DESCRIPTION:
-- A definite subtype is any subtype which is not indefinite. An
-- indefinite subtype is either:
-- a) An unconstrained array subtype.
-- b) A subtype with unknown discriminants (this includes class-wide
-- types).
-- c) A subtype with unconstrained discriminants without defaults.
--
-- The possible forms of indefinite formal subtype are as follows:
--
-- Formal derived types:
-- X - Ancestor is an unconstrained array type
-- * - Ancestor is a discriminated record type without defaults
-- X - Ancestor is a discriminated tagged type
-- * - Ancestor type has unknown discriminants
-- - Formal type has an unknown discriminant part
-- * - Formal type has a known discriminant part
--
-- Formal private types:
-- - Formal type has an unknown discriminant part
-- * - Formal type has a known discriminant part
--
-- The formal subtypes preceded by an 'X' above are not covered, because
-- other rules prevent a definite subtype from being passed as an actual.
-- The formal subtypes preceded by an '*' above are not covered, because
-- 'Definite is less likely to be used for these formals.
--
-- The following kinds of actuals are passed to various of the formal
-- types listed above:
--
-- - Undiscriminated type
-- - Type with defaulted discriminants
-- - Type with undefaulted discriminants
-- - Class-wide type
--
-- A typical usage of S'Definite might be algorithm selection in a
-- generic I/O package, e.g., the use of fixed-length or variable-length
-- records depending on whether the actual is definite or indefinite.
-- In such situations, S'Definite would appear in if conditions or other
-- contexts requiring a boolean expression. This test checks S'Definite
-- in such usage contexts but, for brevity, omits any surrounding
-- usage code.
--
-- TEST FILES:
-- The following files comprise this test:
--
-- FC51B00.A
-- -> CC51B03.A
--
--
-- CHANGE HISTORY:
-- 06 Dec 94 SAIC ACVC 2.0
--
--!
with FC51B00; -- Indefinite subtype declarations.
package CC51B03_0 is
--
-- Formal private type cases:
--
generic
type Formal (<>) is private; -- Formal has unknown
package PrivateFormalUnknownDiscriminants is -- discriminant part.
function Is_Definite return Boolean;
end PrivateFormalUnknownDiscriminants;
--
-- Formal derived type cases:
--
generic
type Formal (<>) is new FC51B00.Vector -- Formal has an unknown disc.
with private; -- part; ancestor is tagged.
package TaggedAncestorUnknownDiscriminants is
function Is_Definite return Boolean;
end TaggedAncestorUnknownDiscriminants;
end CC51B03_0;
--==================================================================--
package body CC51B03_0 is
package body PrivateFormalUnknownDiscriminants is
function Is_Definite return Boolean is
begin
if Formal'Definite then -- Attribute used in "if"
-- ...Execute algorithm #1... -- condition inside subprogram.
return True;
else
-- ...Execute algorithm #2...
return False;
end if;
end Is_Definite;
end PrivateFormalUnknownDiscriminants;
package body TaggedAncestorUnknownDiscriminants is
function Is_Definite return Boolean is
begin
return Formal'Definite; -- Attribute used in return
end Is_Definite; -- statement inside subprogram.
end TaggedAncestorUnknownDiscriminants;
end CC51B03_0;
--==================================================================--
with FC51B00;
package CC51B03_1 is
subtype Spin_Type is Natural range 0 .. 3;
type Extended_Vector (Spin : Spin_Type) is -- Tagged type with
new FC51B00.Vector with null record; -- discriminant (indefinite).
end CC51B03_1;
--==================================================================--
with FC51B00; -- Indefinite subtype declarations.
with CC51B03_0; -- Generic package declarations.
with CC51B03_1;
with Report;
procedure CC51B03 is
--
-- Instances for formal private type with unknown discriminants:
--
package PrivateFormal_UndiscriminatedTaggedActual is new
CC51B03_0.PrivateFormalUnknownDiscriminants (FC51B00.Vector);
package PrivateFormal_ClassWideActual is new
CC51B03_0.PrivateFormalUnknownDiscriminants (FC51B00.Vector'Class);
package PrivateFormal_DiscriminatedTaggedActual is new
CC51B03_0.PrivateFormalUnknownDiscriminants (FC51B00.Square_Pair);
package PrivateFormal_DiscriminatedUndefaultedRecordActual is new
CC51B03_0.PrivateFormalUnknownDiscriminants (FC51B00.Square);
subtype Length is Natural range 0 .. 20;
type Message (Len : Length := 0) is record -- Record type with defaulted
Text : String (1 .. Len); -- discriminant (definite).
end record;
package PrivateFormal_DiscriminatedDefaultedRecordActual is new
CC51B03_0.PrivateFormalUnknownDiscriminants (Message);
--
-- Instances for formal derived tagged type with unknown discriminants:
--
package DerivedFormal_UndiscriminatedTaggedActual is new
CC51B03_0.TaggedAncestorUnknownDiscriminants (FC51B00.Vector);
package DerivedFormal_ClassWideActual is new
CC51B03_0.TaggedAncestorUnknownDiscriminants (FC51B00.Vector'Class);
package DerivedFormal_DiscriminatedTaggedActual is new
CC51B03_0.TaggedAncestorUnknownDiscriminants (CC51B03_1.Extended_Vector);
begin
Report.Test ("CC51B03", "Check that S'Definite returns true if the " &
"actual corresponding to S is definite, and false otherwise");
if not PrivateFormal_UndiscriminatedTaggedActual.Is_Definite then
Report.Failed ("Formal private/unknown discriminants: wrong " &
"result for undiscriminated tagged actual");
end if;
if PrivateFormal_ClassWideActual.Is_Definite then
Report.Failed ("Formal private/unknown discriminants: wrong " &
"result for class-wide actual");
end if;
if PrivateFormal_DiscriminatedTaggedActual.Is_Definite then
Report.Failed ("Formal private/unknown discriminants: wrong " &
"result for discriminated tagged actual");
end if;
if PrivateFormal_DiscriminatedUndefaultedRecordActual.Is_Definite then
Report.Failed ("Formal private/unknown discriminants: wrong result " &
"for record actual with undefaulted discriminants");
end if;
if not PrivateFormal_DiscriminatedDefaultedRecordActual.Is_Definite then
Report.Failed ("Formal private/unknown discriminants: wrong result " &
"for record actual with defaulted discriminants");
end if;
if not DerivedFormal_UndiscriminatedTaggedActual.Is_Definite then
Report.Failed ("Formal derived/unknown discriminants: wrong result " &
"for undiscriminated tagged actual");
end if;
if DerivedFormal_ClassWideActual.Is_Definite then
Report.Failed ("Formal derived/unknown discriminants: wrong result " &
"for class-wide actual");
end if;
if DerivedFormal_DiscriminatedTaggedActual.Is_Definite then
Report.Failed ("Formal derived/unknown discriminants: wrong result " &
"for discriminated tagged actual");
end if;
Report.Result;
end CC51B03;