Next: , Previous: No_Dispatch, Up: Partition-Wide Restrictions


No_Dispatching_Calls

[GNAT] This restriction ensures at compile time that the code generated by the compiler involves no dispatching calls. The use of this restriction allows the safe use of record extensions, classwide membership tests and other classwide features not involving implicit dispatching. This restriction ensures that the code contains no indirect calls through a dispatching mechanism. Note that this includes internally-generated calls created by the compiler, for example in the implementation of class-wide objects assignments. The membership test is allowed in the presence of this restriction, because its implementation requires no dispatching. This restriction is comparable to the official Ada restriction No_Dispatch except that it is a bit less restrictive in that it allows all classwide constructs that do not imply dispatching. The following example indicates constructs that violate this restriction.

     package Pkg is
       type T is tagged record
         Data : Natural;
       end record;
       procedure P (X : T);
     
       type DT is new T with record
         More_Data : Natural;
       end record;
       procedure Q (X : DT);
     end Pkg;
     
     with Pkg; use Pkg;
     procedure Example is
       procedure Test (O : T'Class) is
         N : Natural  := O'Size;--  Error: Dispatching call
         C : T'Class := O;      --  Error: implicit Dispatching Call
       begin
         if O in DT'Class then  --  OK   : Membership test
            Q (DT (O));         --  OK   : Type conversion plus direct call
         else
            P (O);              --  Error: Dispatching call
         end if;
       end Test;
     
       Obj : DT;
     begin
       P (Obj);                 --  OK   : Direct call
       P (T (Obj));             --  OK   : Type conversion plus direct call
       P (T'Class (Obj));       --  Error: Dispatching call
     
       Test (Obj);              --  OK   : Type conversion
     
       if Obj in T'Class then   --  OK   : Membership test
          null;
       end if;
     end Example;