c460004.a

来自「linux下编程用 编译软件」· A 代码 · 共 336 行

A
336
字号
-- 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;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?