| -- C460005.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, for a view conversion of a tagged type that is the left |
| -- side of an assignment statement, the assignment assigns to the |
| -- corresponding part of the object denoted by the operand. |
| -- |
| -- 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. |
| -- |
| -- For the cases where the view conversion is the left side of an |
| -- assignment statement, and Constraint_Error should not be raised, |
| -- an additional check is made that only the corresponding portion |
| -- of the operand is updated by the assignment. For example: |
| -- |
| -- type T is tagged record |
| -- C1 : Integer := 0; |
| -- end record; |
| -- |
| -- type DT is new T with record |
| -- C2 : Integer := 0; |
| -- end record; |
| -- |
| -- A : T := (C1 => 5); |
| -- B : DT := (C1 => 0, C2 => 10); |
| -- CWDT : T'Class := B; |
| -- |
| -- T(CWDT) := A; -- Updates component C1; C2 remains unchanged. |
| -- -- Value of CWDT is (C1 => 5, C2 => 10). |
| -- |
| -- |
| -- CHANGE HISTORY: |
| -- 31 Jul 95 SAIC Initial prerelease version. |
| -- 22 Apr 96 SAIC ACVC 2.1: Added a check for correct tag. |
| -- 08 Sep 96 SAIC ACVC 2.1: Modified Report.Test. |
| -- |
| --! |
| |
| package C460005_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); |
| |
| end C460005_0; |
| |
| |
| --==================================================================-- |
| |
| |
| package body C460005_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; |
| |
| end C460005_0; |
| |
| |
| --==================================================================-- |
| |
| |
| with C460005_0; |
| use C460005_0; |
| |
| with Report; |
| procedure C460005 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"); |
| |
| Tag_Type_Res : constant Tag_Type := (C1 => 25); |
| DTag_Type_Res : constant DTag_Type := (Tag_Type_Res with "Hello"); |
| DDTag_Type_Res : constant DDTag_Type := (DTag_Type_Res with "World"); |
| |
| begin |
| |
| Report.Test ("C460005", "Check that, for a view conversion of a tagged " & |
| "type that is the left side of an assignment statement, " & |
| "the assignment assigns to the corresponding part of the " & |
| "object denoted by the operand"); |
| |
| |
| declare |
| procedure CW_Proc (P : Tag_Type'Class) is |
| Operand : Tag_Type'Class := P; |
| begin |
| Tag_Type(Operand) := Tag_Type_Value; |
| |
| if (Operand /= Tag_Type'Class (Tag_Type_Value)) then |
| Report.Failed ("Operand 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 (Tag_Type_Init); |
| end; |
| |
| ---------------------------------------------------------------------- |
| |
| declare |
| procedure CW_Proc (P : Tag_Type'Class) is |
| Operand : Tag_Type'Class := P; |
| begin |
| DTag_Type(Operand) := DTag_Type_Value; |
| Report.Failed ("Constraint_Error not raised: #02"); |
| |
| exception |
| when Constraint_Error => null; -- expected exception |
| when others => Report.Failed ("Unexpected exception: #02"); |
| 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 |
| DDTag_Type(Operand) := DDTag_Type_Value; |
| Report.Failed ("Constraint_Error not raised: #03"); |
| |
| exception |
| when Constraint_Error => null; -- expected exception |
| when others => Report.Failed ("Unexpected exception: #03"); |
| 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 |
| Tag_Type(Operand) := Tag_Type_Value; |
| |
| if Operand not in DTag_Type then |
| Report.Failed ("Operand has wrong tag: #04"); |
| elsif (Operand /= Tag_Type'Class (DTag_Type_Res)) |
| then -- Check to make |
| Report.Failed ("Operand has wrong value: #04"); -- sure that C2 was |
| end if; -- not modified. |
| |
| exception |
| when Constraint_Error => |
| Report.Failed ("Constraint_Error raised: #04"); |
| when others => |
| Report.Failed ("Unexpected exception: #04"); |
| 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 |
| Tag_Type(Operand) := Tag_Type_Value; |
| |
| if Operand not in DDTag_Type then |
| Report.Failed ("Operand has wrong tag: #05"); |
| elsif (Operand /= Tag_Type'Class (DDTag_Type_Res)) |
| then -- Check to make |
| Report.Failed ("Operand has wrong value: #05"); -- sure that C2, C3 |
| end if; -- were not changed. |
| |
| 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_Init); |
| end; |
| |
| Report.Result; |
| |
| end C460005; |