| -- C330002.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 a subtype indication of a variable object defines an |
| -- indefinite subtype, then there is an initialization expression. |
| -- Check that the object remains so constrained throughout its lifetime. |
| -- Check for cases of tagged record, arrays and generic formal type. |
| -- |
| -- TEST DESCRIPTION: |
| -- 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. |
| -- |
| -- Declare tagged types with unconstrained discriminants without |
| -- defaults. Declare an unconstrained array. Declare a generic formal |
| -- type with an unknown discriminant and a formal object of this type. |
| -- In the generic package, declare an object of the formal type using |
| -- the formal object as its initial value. In the main program, |
| -- declare objects of tagged types. Instantiate the generic package. |
| -- The test checks that Constraint_Error is raised if an attempt is |
| -- made to change bounds as well as discriminants of the objects of the |
| -- indefinite subtypes. |
| -- |
| -- |
| -- CHANGE HISTORY: |
| -- 01 Nov 95 SAIC Initial prerelease version. |
| -- 27 Jul 96 SAIC Modified test description & Report.Test. Added |
| -- code to prevent dead variable optimization. |
| -- |
| --! |
| |
| package C330002_0 is |
| |
| subtype Small_Num is Integer range 1 .. 20; |
| |
| -- Types with unconstrained discriminants without defaults. |
| |
| type Tag_Type (Disc : Small_Num) is tagged |
| record |
| S : String (1 .. Disc); |
| end record; |
| |
| function Tag_Value return Tag_Type; |
| |
| procedure Assign_Tag (A : out Tag_Type); |
| |
| procedure Avoid_Optimization_and_Fail (P : Tag_Type; Msg : String); |
| |
| --------------------------------------------------------------------- |
| -- An unconstrained array type. |
| |
| type Array_Type is array (Positive range <>) of Integer; |
| |
| function Array_Value return Array_Type; |
| |
| procedure Assign_Array (A : out Array_Type); |
| |
| --------------------------------------------------------------------- |
| generic |
| -- Type with an unknown discriminant. |
| type Formal_Type (<>) is private; |
| FT_Obj : Formal_Type; |
| package Gen is |
| Gen_Obj : Formal_Type := FT_Obj; |
| end Gen; |
| |
| end C330002_0; |
| |
| --==================================================================-- |
| |
| with Report; |
| package body C330002_0 is |
| |
| procedure Assign_Tag (A : out Tag_Type) is |
| begin |
| A := (3, "Bye"); |
| end Assign_Tag; |
| |
| ---------------------------------------------------------------------- |
| procedure Avoid_Optimization_and_Fail (P : Tag_Type; Msg : String) is |
| Default : Tag_Type := (1, "!"); -- Unique value. |
| begin |
| if P = Default then -- Both If branches can't do the same thing. |
| Report.Failed (Msg & ": Constraint_Error not raised"); |
| else -- Subtests should always select this path. |
| Report.Failed ("Constraint_Error not raised " & Msg); |
| end if; |
| end Avoid_Optimization_and_Fail; |
| |
| ---------------------------------------------------------------------- |
| function Tag_Value return Tag_Type is |
| TO : Tag_Type := (4 , "ACVC"); |
| begin |
| return TO; |
| end Tag_Value; |
| |
| ---------------------------------------------------------------------- |
| function Array_Value return Array_Type is |
| IA : Array_Type := (20, 31); |
| begin |
| return IA; |
| end Array_Value; |
| |
| ---------------------------------------------------------------------- |
| procedure Assign_Array (A : out Array_Type) is |
| begin |
| A := (84, 36); |
| end Assign_Array; |
| |
| end C330002_0; |
| |
| --==================================================================-- |
| |
| with Report; |
| with C330002_0; |
| use C330002_0; |
| |
| procedure C330002 is |
| |
| begin |
| Report.Test ("C330002", "Check that if a subtype indication of a " & |
| "variable object defines an indefinite subtype, then " & |
| "there is an initialization expression. Check that " & |
| "the object remains so constrained throughout its " & |
| "lifetime. Check that Constraint_Error is raised " & |
| "if an attempt is made to change bounds as well as " & |
| "discriminants of the objects of the indefinite " & |
| "subtypes. Check for cases of tagged record and generic " & |
| "formal types"); |
| |
| TagObj_Block: |
| declare |
| TObj_ByAgg : Tag_Type := (5, "Hello"); -- Initial assignment is |
| -- aggregate. |
| TObj_ByObj : Tag_Type := TObj_ByAgg; -- Initial assignment is |
| -- an object. |
| TObj_ByFunc : Tag_Type := Tag_Value; -- Initial assignment is |
| -- function return value. |
| Ren_Obj : Tag_Type renames TObj_ByAgg; |
| |
| begin |
| |
| begin |
| if (TObj_ByAgg.Disc /= 5) or (TObj_ByAgg.S /= "Hello") then |
| Report.Failed ("Wrong initial values for TObj_ByAgg"); |
| end if; |
| |
| TObj_ByAgg := (2, "Hi"); -- C_E, can't change the |
| -- value of the discriminant. |
| |
| Avoid_Optimization_and_Fail (TObj_ByAgg, "Subtest 1"); |
| |
| exception |
| when Constraint_Error => null; -- Exception is expected. |
| when others => |
| Report.Failed ("Unexpected exception - Subtest 1"); |
| end; |
| |
| |
| begin |
| Assign_Tag (Ren_Obj); -- C_E, can't change the |
| -- value of the discriminant. |
| |
| Avoid_Optimization_and_Fail (Ren_Obj, "Subtest 2"); |
| |
| exception |
| when Constraint_Error => null; -- Exception is expected. |
| when others => |
| Report.Failed ("Unexpected exception - Subtest 2"); |
| end; |
| |
| |
| begin |
| if (TObj_ByObj.Disc /= 5) or (TObj_ByObj.S /= "Hello") then |
| Report.Failed ("Wrong initial values for TObj_ByObj"); |
| end if; |
| |
| TObj_ByObj := (3, "Bye"); -- C_E, can't change the |
| -- value of the discriminant. |
| |
| Avoid_Optimization_and_Fail (TObj_ByObj, "Subtest 3"); |
| |
| exception |
| when Constraint_Error => null; -- Exception is expected. |
| when others => |
| Report.Failed ("Unexpected exception - Subtest 3"); |
| end; |
| |
| |
| begin |
| if (TObj_ByFunc.Disc /= 4) or (TObj_ByFunc.S /= "ACVC") then |
| Report.Failed ("Wrong initial values for TObj_ByFunc"); |
| end if; |
| |
| TObj_ByFunc := (5, "Aloha"); -- C_E, can't change the |
| -- value of the discriminant. |
| |
| Avoid_Optimization_and_Fail (TObj_ByFunc, "Subtest 4"); |
| |
| exception |
| when Constraint_Error => null; -- Exception is expected. |
| when others => |
| Report.Failed ("Unexpected exception - Subtest 4"); |
| end; |
| |
| end TagObj_Block; |
| |
| |
| ArrObj_Block: |
| declare |
| Arr_Const : constant Array_Type |
| := (9, 7, 6, 8); |
| Arr_ByAgg : Array_Type -- Initial assignment is |
| := (10, 11, 12); -- aggregate. |
| Arr_ByFunc : Array_Type -- Initial assignment is |
| := Array_Value; -- function return value. |
| Arr_ByObj : Array_Type -- Initial assignment is |
| := Arr_ByAgg; -- object. |
| |
| Arr_Obj : array (Positive range <>) of Integer |
| := (1, 2, 3, 4, 5); |
| begin |
| |
| begin |
| if (Arr_Const'First /= 1) or (Arr_Const'Last /= 4) then |
| Report.Failed ("Wrong bounds for Arr_Const"); |
| end if; |
| |
| if (Arr_ByAgg'First /= 1) or (Arr_ByAgg'Last /= 3) then |
| Report.Failed ("Wrong bounds for Arr_ByAgg"); |
| end if; |
| |
| if (Arr_ByFunc'First /= 1) or (Arr_ByFunc'Last /= 2) then |
| Report.Failed ("Wrong bounds for Arr_ByFunc"); |
| end if; |
| |
| if (Arr_ByObj'First /= 1) or (Arr_ByObj'Last /= 3) then |
| Report.Failed ("Wrong bounds for Arr_ByObj"); |
| end if; |
| |
| Assign_Array (Arr_ByObj); -- C_E, Arr_ByObj bounds are |
| -- 1..3. |
| |
| Report.Failed ("Constraint_Error not raised - Subtest 5"); |
| |
| exception |
| when Constraint_Error => null; -- Exception is expected. |
| when others => |
| Report.Failed ("Unexpected exception - Subtest 5"); |
| end; |
| |
| |
| begin |
| if (Arr_Obj'First /= 1) or (Arr_Obj'Last /= 5) then |
| Report.Failed ("Wrong bounds for Arr_Obj"); |
| end if; |
| |
| for I in 0 .. 5 loop |
| Arr_Obj (I + 1) := I + 5; -- C_E, Arr_Obj bounds are |
| end loop; -- 1..5. |
| |
| Report.Failed ("Constraint_Error not raised - Subtest 6"); |
| |
| exception |
| when Constraint_Error => null; -- Exception is expected. |
| when others => |
| Report.Failed ("Unexpected exception - Subtest 6"); |
| end; |
| |
| end ArrObj_Block; |
| |
| |
| GenericObj_Block: |
| declare |
| type Rec (Disc : Small_Num) is |
| record |
| S : Small_Num := Disc; |
| end record; |
| |
| Rec_Obj : Rec := (2, 2); |
| package IGen is new Gen (Rec, Rec_Obj); |
| |
| begin |
| IGen.Gen_Obj := (3, 3); -- C_E, can't change the |
| -- value of the discriminant. |
| |
| Report.Failed ("Constraint_Error not raised - Subtest 7"); |
| |
| -- Next line prevents dead assignment. |
| Report.Comment ("Disc is" & Integer'Image (IGen.Gen_Obj.Disc)); |
| |
| exception |
| when Constraint_Error => null; -- Exception is expected. |
| when others => |
| Report.Failed ("Unexpected exception - Subtest 7"); |
| |
| end GenericObj_Block; |
| |
| Report.Result; |
| |
| end C330002; |