blob: b7dbdd6e97ff4c6b001a5ba43fe719c28e154ff6 [file] [log] [blame]
-- C540001.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 an expression in a case statement may be of a generic formal
-- type. Check that a function call may be used as a case statement
-- expression. Check that a call to a generic formal function may be
-- used as a case statement expression. Check that a call to an inherited
-- function may be used as a case statement expression even if its result
-- type does not correspond to any nameable subtype.
--
-- TEST DESCRIPTION:
-- This transition test creates examples where expressions in a case
-- statement can be a generic formal object and a call to a generic formal
-- function. This test also creates examples when either a function call,
-- a renaming of a function, or a call to an inherited function is used
-- in the case expressions, the choices of the case statement only need
-- to cover the values in the result of the function.
--
-- Inspired by B54A08A.ADA.
--
--
-- CHANGE HISTORY:
-- 12 Feb 96 SAIC Initial version for ACVC 2.1.
--
--!
package C540001_0 is
type Int is range 1 .. 2;
end C540001_0;
--==================================================================--
with C540001_0;
package C540001_1 is
type Enum_Type is (Eh, Bee, Sea, Dee); -- Range of Enum_Type'Val is 0..3.
type Mixed is ('A','B', 'C', None);
subtype Small_Num is Natural range 0 .. 10;
type Small_Int is range 1 .. 2;
function Get_Small_Int (P : Boolean) return Small_Int;
procedure Assign_Mixed (P1 : in Boolean;
P2 : out Mixed);
type Tagged_Type is tagged
record
C1 : Enum_Type;
end record;
function Get_Tagged (P : Tagged_Type) return C540001_0.Int;
end C540001_1;
--==================================================================--
package body C540001_1 is
function Get_Small_Int (P : Boolean) return Small_Int is
begin
if P then
return Small_Int'First;
else
return Small_Int'Last;
end if;
end Get_Small_Int;
---------------------------------------------------------------------
procedure Assign_Mixed (P1 : in Boolean;
P2 : out Mixed) is
begin
case Get_Small_Int (P1) is -- Function call as expression
when 1 => P2 := None; -- in case statement.
when 2 => P2 := 'A';
-- No others needed.
end case;
end Assign_Mixed;
---------------------------------------------------------------------
function Get_Tagged (P : Tagged_Type) return C540001_0.Int is
begin
return C540001_0.Int'Last;
end Get_Tagged;
end C540001_1;
--==================================================================--
generic
type Formal_Scalar is range <>;
FSO : Formal_Scalar;
package C540001_2 is
type Enum is (Alpha, Beta, Theta);
procedure Assign_Enum (ET : out Enum);
end C540001_2;
--==================================================================--
package body C540001_2 is
procedure Assign_Enum (ET : out Enum) is
begin
case FSO is -- Type of expression in case
when 1 => ET := Alpha; -- statement is generic formal type.
when 2 => ET := Beta;
when others => ET := Theta;
end case;
end Assign_Enum;
end C540001_2;
--==================================================================--
with C540001_1;
generic
type Formal_Enum_Type is new C540001_1.Enum_Type;
with function Formal_Func (P : C540001_1.Small_Num)
return Formal_Enum_Type is <>;
function C540001_3 (P : C540001_1.Small_Num) return Formal_Enum_Type;
--==================================================================--
function C540001_3 (P : C540001_1.Small_Num) return Formal_Enum_Type is
begin
return Formal_Func (P);
end C540001_3;
--==================================================================--
with C540001_1;
generic
type Formal_Int_Type is new C540001_1.Small_Int;
with function Formal_Func return Formal_Int_Type;
package C540001_4 is
procedure Gen_Assign_Mixed (P : out C540001_1.Mixed);
end C540001_4;
--==================================================================--
package body C540001_4 is
procedure Gen_Assign_Mixed (P : out C540001_1.Mixed) is
begin
case Formal_Func is -- Case expression is
when 1 => P := C540001_1.'A'; -- generic function.
when others => P := C540001_1.'B';
end case;
end Gen_Assign_Mixed;
end C540001_4;
--==================================================================--
with C540001_1;
package C540001_5 is
type New_Tagged is new C540001_1.Tagged_Type with
record
C2 : C540001_1.Mixed;
end record;
-- Inherits Get_Tagged (P : New_Tagged) return C540001_0.Int;
-- Note that the return type of the inherited function is not
-- nameable here.
procedure Assign_Tagged (P1 : in New_Tagged;
P2 : out New_Tagged);
end C540001_5;
--==================================================================--
package body C540001_5 is
procedure Assign_Tagged (P1 : in New_Tagged;
P2 : out New_Tagged) is
begin
case Get_Tagged (P1) is -- Case expression is
-- inherited function.
when 2 => P2 := (C540001_1.Bee, 'B');
when others => P2 := (C540001_1.Sea, C540001_1.None);
end case;
end Assign_Tagged;
end C540001_5;
--==================================================================--
with Report;
with C540001_1;
with C540001_2;
with C540001_3;
with C540001_4;
with C540001_5;
procedure C540001 is
type Value is range 1 .. 5;
begin
Report.Test ("C540001", "Check that an expression in a case statement " &
"may be of a generic formal type. Check that a function " &
"call may be used as a case statement expression. Check " &
"that a call to a generic formal function may be used as " &
"a case statement expression. Check that a call to an " &
"inherited function may be used as a case statement " &
"expression");
Generic_Formal_Object_Subtest:
begin
declare
One : Value := 1;
package One_Pck is new C540001_2 (Value, One);
use One_Pck;
EObj : Enum;
begin
Assign_Enum (EObj);
if EObj /= Alpha then
Report.Failed ("Incorrect result for value of one in generic" &
"formal object subtest");
end if;
end;
declare
Five : Value := 5;
package Five_Pck is new C540001_2 (Value, Five);
use Five_Pck;
EObj : Enum;
begin
Assign_Enum (EObj);
if EObj /= Theta then
Report.Failed ("Incorrect result for value of five in generic" &
"formal object subtest");
end if;
end;
end Generic_Formal_Object_Subtest;
Instantiated_Generic_Function_Subtest:
declare
type New_Enum_Type is new C540001_1.Enum_Type;
function Get_Enum_Value (P : C540001_1.Small_Num)
return New_Enum_Type is
begin
return New_Enum_Type'Val (P);
end Get_Enum_Value;
function Val_Func is new C540001_3
(Formal_Enum_Type => New_Enum_Type,
Formal_Func => Get_Enum_Value);
procedure Assign_Num (P : in out C540001_1.Small_Num) is
begin
case Val_Func (P) is -- Case expression is
-- instantiated generic
when New_Enum_Type (C540001_1.Eh) | -- function.
New_Enum_Type (C540001_1.Sea) => P := 4;
when New_Enum_Type (C540001_1.Bee) => P := 7;
when others => P := 9;
end case;
end Assign_Num;
SNObj : C540001_1.Small_Num;
begin
SNObj := 0;
Assign_Num (SNObj);
if SNObj /= 4 then
Report.Failed ("Incorrect result for value of zero in call to " &
"generic function subtest");
end if;
SNObj := 3;
Assign_Num (SNObj);
if SNObj /= 9 then
Report.Failed ("Incorrect result for value of three in call to " &
"generic function subtest");
end if;
end Instantiated_Generic_Function_Subtest;
-- When a function call, a renaming of a function, or a call to an
-- inherited function is used in the case expressions, the choices
-- of the case statement only need to cover the values in the result
-- of the function.
Function_Call_Subtest:
declare
MObj : C540001_1.Mixed := 'B';
BObj : Boolean := True;
use type C540001_1.Mixed;
begin
C540001_1.Assign_Mixed (BObj, MObj);
if MObj /= C540001_1.None then
Report.Failed ("Incorrect result for value of true in function" &
"call subtest");
end if;
BObj := False;
C540001_1.Assign_Mixed (BObj, MObj);
if MObj /= C540001_1.'A' then
Report.Failed ("Incorrect result for value of false in function" &
"call subtest");
end if;
end Function_Call_Subtest;
Function_Renaming_Subtest:
declare
use C540001_1;
function Rename_Get_Small_Int (P : Boolean)
return Small_Int renames Get_Small_Int;
MObj : Mixed := None;
BObj : Boolean := False;
begin
case Rename_Get_Small_Int (BObj) is
when 1 => MObj := 'A';
when 2 => MObj := 'B';
-- No others needed.
end case;
if MObj /= 'B' then
Report.Failed ("Incorrect result for value of false in function" &
"renaming subtest");
end if;
end Function_Renaming_Subtest;
Call_To_Generic_Formal_Function_Subtest:
declare
type New_Small_Int is new C540001_1.Small_Int;
function Get_Int_Value return New_Small_Int is
begin
return New_Small_Int'First;
end Get_Int_Value;
package Int_Pck is new C540001_4
(Formal_Int_Type => New_Small_Int,
Formal_Func => Get_Int_Value);
use type C540001_1.Mixed;
MObj : C540001_1.Mixed := C540001_1.None;
begin
Int_Pck.Gen_Assign_Mixed (MObj);
if MObj /= C540001_1.'A' then
Report.Failed ("Incorrect result in call to generic formal " &
"function subtest");
end if;
end Call_To_Generic_Formal_Function_Subtest;
Call_To_Inherited_Function_Subtest:
declare
NTObj1 : C540001_5.New_Tagged := (C1 => C540001_1.Eh,
C2 => C540001_1.'A');
NTObj2 : C540001_5.New_Tagged := (C540001_1.Dee, C540001_1.'C');
use type C540001_1.Mixed;
use type C540001_1.Enum_Type;
begin
C540001_5.Assign_Tagged (NTObj1, NTObj2);
if NTObj2.C1 /= C540001_1.Bee or
NTObj2.C2 /= C540001_1.'B' then
Report.Failed ("Incorrect result in inherited function subtest");
end if;
end Call_To_Inherited_Function_Subtest;
Report.Result;
end C540001;