blob: b00428121b80b13a6e2c5d1174e29b9fbc00c9b0 [file] [log] [blame]
-- C460004.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 the operand type of a type conversion is class-wide,
-- Constraint_Error is raised if the tag of the operand does not
-- identify a specific type that is covered by or descended from the
-- target type.
--
-- TEST DESCRIPTION:
-- View conversions of class-wide operands to specific types are
-- placed on the right and left sides of assignment statements, and
-- conversions of class-wide operands to class-wide types are used
-- as actual parameters to dispatching operations. In all cases, a
-- check is made that Constraint_Error is raised if the tag of the
-- operand does not identify a specific type covered by or descended
-- from the target type, and not raised otherwise.
--
-- A specific type is descended from itself and from those types it is
-- directly or indirectly derived from. A specific type is covered by
-- itself and each class-wide type to whose class it belongs.
--
-- A class-wide type T'Class is descended from T and those types which
-- T is descended from. A class-wide type is covered by each class-wide
-- type to whose class it belongs.
--
--
-- CHANGE HISTORY:
-- 19 Jul 95 SAIC Initial prerelease version.
-- 18 Apr 96 SAIC ACVC 2.1: Added a check for correct tag.
--
--!
package C460004_0 is
type Tag_Type is tagged record
C1 : Natural;
end record;
procedure Proc (X : in out Tag_Type);
type DTag_Type is new Tag_Type with record
C2 : String (1 .. 5);
end record;
procedure Proc (X : in out DTag_Type);
type DDTag_Type is new DTag_Type with record
C3 : String (1 .. 5);
end record;
procedure Proc (X : in out DDTag_Type);
procedure NewProc (X : in DDTag_Type);
function CWFunc (X : Tag_Type'Class) return Tag_Type'Class;
end C460004_0;
--==================================================================--
with Report;
package body C460004_0 is
procedure Proc (X : in out Tag_Type) is
begin
X.C1 := 25;
end Proc;
-----------------------------------------
procedure Proc (X : in out DTag_Type) is
begin
Proc ( Tag_Type(X) );
X.C2 := "Earth";
end Proc;
-----------------------------------------
procedure Proc (X : in out DDTag_Type) is
begin
Proc ( DTag_Type(X) );
X.C3 := "Orbit";
end Proc;
-----------------------------------------
procedure NewProc (X : in DDTag_Type) is
Y : DDTag_Type := X;
begin
Proc (Y);
exception
when others =>
Report.Failed ("Unexpected exception in NewProc");
end NewProc;
-----------------------------------------
function CWFunc (X : Tag_Type'Class) return Tag_Type'Class is
Y : Tag_Type'Class := X;
begin
Proc (Y);
return Y;
end CWFunc;
end C460004_0;
--==================================================================--
with C460004_0;
use C460004_0;
with Report;
procedure C460004 is
Tag_Type_Init : constant Tag_Type := (C1 => 0);
DTag_Type_Init : constant DTag_Type := (Tag_Type_Init with "Hello");
DDTag_Type_Init : constant DDTag_Type := (DTag_Type_Init with "World");
Tag_Type_Value : constant Tag_Type := (C1 => 25);
DTag_Type_Value : constant DTag_Type := (Tag_Type_Value with "Earth");
DDTag_Type_Value : constant DDTag_Type := (DTag_Type_Value with "Orbit");
begin
Report.Test ("C460004", "Check that for a view conversion of a " &
"class-wide operand, Constraint_Error is raised if the " &
"tag of the operand does not identify a specific type " &
"covered by or descended from the target type");
--
-- View conversion to specific type:
--
declare
procedure CW_Proc (P : Tag_Type'Class) is
Target : Tag_Type := Tag_Type_Init;
begin
Target := Tag_Type(P);
if (Target /= Tag_Type_Value) then
Report.Failed ("Target has wrong value: #01");
end if;
exception
when Constraint_Error =>
Report.Failed ("Constraint_Error raised: #01");
when others =>
Report.Failed ("Unexpected exception: #01");
end CW_Proc;
begin
CW_Proc (DDTag_Type_Value);
end;
----------------------------------------------------------------------
declare
Target : DTag_Type := DTag_Type_Init;
begin
Target := DTag_Type(CWFunc(DDTag_Type_Value));
if (Target /= DTag_Type_Value) then
Report.Failed ("Target has wrong value: #02");
end if;
exception
when Constraint_Error => Report.Failed ("Constraint_Error raised: #02");
when others => Report.Failed ("Unexpected exception: #02");
end;
----------------------------------------------------------------------
declare
Target : DDTag_Type;
begin
Target := DDTag_Type(CWFunc(Tag_Type_Value));
-- CWFunc returns a Tag_Type; its tag is preserved through
-- the view conversion. Constraint_Error should be raised.
Report.Failed ("Constraint_Error not raised: #03");
exception
when Constraint_Error => null; -- expected exception
when others => Report.Failed ("Unexpected exception: #03");
end;
----------------------------------------------------------------------
declare
procedure CW_Proc (P : Tag_Type'Class) is
begin
NewProc (DDTag_Type(P));
Report.Failed ("Constraint_Error not raised: #04");
exception
when Constraint_Error => null; -- expected exception
when others => Report.Failed ("Unexpected exception: #04");
end CW_Proc;
begin
CW_Proc (DTag_Type_Value);
end;
----------------------------------------------------------------------
declare
procedure CW_Proc (P : Tag_Type'Class) is
Target : DDTag_Type := DDTag_Type_Init;
begin
Target := DDTag_Type(P);
if (Target /= DDTag_Type_Value) then
Report.Failed ("Target has wrong value: #05");
end if;
exception
when Constraint_Error =>
Report.Failed ("Constraint_Error raised: #05");
when others
=> Report.Failed ("Unexpected exception: #05");
end CW_Proc;
begin
CW_Proc (DDTag_Type_Value);
end;
--
-- View conversion to class-wide type:
--
declare
procedure CW_Proc (P : Tag_Type'Class) is
Operand : Tag_Type'Class := P;
begin
Proc( DTag_Type'Class(Operand) );
Report.Failed ("Constraint_Error not raised: #06");
exception
when Constraint_Error => null; -- expected exception
when others => Report.Failed ("Unexpected exception: #06");
end CW_Proc;
begin
CW_Proc (Tag_Type_Init);
end;
----------------------------------------------------------------------
declare
procedure CW_Proc (P : Tag_Type'Class) is
Operand : Tag_Type'Class := P;
begin
Proc( DDTag_Type'Class(Operand) );
Report.Failed ("Constraint_Error not raised: #07");
exception
when Constraint_Error => null; -- expected exception
when others => Report.Failed ("Unexpected exception: #07");
end CW_Proc;
begin
CW_Proc (Tag_Type_Init);
end;
----------------------------------------------------------------------
declare
procedure CW_Proc (P : Tag_Type'Class) is
Operand : Tag_Type'Class := P;
begin
Proc( DTag_Type'Class(Operand) );
if Operand not in DTag_Type then
Report.Failed ("Operand has wrong tag: #08");
elsif (Operand /= Tag_Type'Class (DTag_Type_Value)) then
Report.Failed ("Operand has wrong value: #08");
end if;
exception
when Constraint_Error =>
Report.Failed ("Constraint_Error raised: #08");
when others =>
Report.Failed ("Unexpected exception: #08");
end CW_Proc;
begin
CW_Proc (DTag_Type_Init);
end;
----------------------------------------------------------------------
declare
procedure CW_Proc (P : Tag_Type'Class) is
Operand : Tag_Type'Class := P;
begin
Proc( Tag_Type'Class(Operand) );
if Operand not in DDTag_Type then
Report.Failed ("Operand has wrong tag: #09");
elsif (Operand /= Tag_Type'Class (DDTag_Type_Value)) then
Report.Failed ("Operand has wrong value: #09");
end if;
exception
when Constraint_Error =>
Report.Failed ("Constraint_Error raised: #09");
when others =>
Report.Failed ("Unexpected exception: #09");
end CW_Proc;
begin
CW_Proc (DDTag_Type_Init);
end;
Report.Result;
end C460004;