Node:Restricted Types, Previous:Type Initializers, Up:Type Definition Possibilities



Restricted Types

GPC supports restricted types, defined in Extended Pascal. A value of a restricted type may be passed as a value parameter to a formal parameter possessing its underlying type, or returned as the result of a function. A variable of a restricted type may be passed as a variable parameter to a formal parameter possessing the same type or its underlying type. No other operations, such as accessing a component of a restricted type value or performing arithmetic, are possible.

program RestrictedDemo;

type
  UnrestrictedRecord = record
    a: Integer;
  end;
  RestrictedRecord = restricted UnrestrictedRecord;

var
  r1: UnrestrictedRecord;
  r2: RestrictedRecord;
  i: restricted Integer;
  k: Integer;

function AccessRestricted (p: UnrestrictedRecord): RestrictedRecord;
var URes: UnrestrictedRecord;
begin
  { The parameter is treated as unrestricted, even though the actual
    parameter may be a restricted object }
  URes.a := p.a;
  { It is allowed to assign a function result }
  AccessRestricted := URes;
end;

begin
  r1.a := 354;

  { Assigning a restricted function result to a restricted object }
  { @@ Verify if this should really be allowed????? }
  r2 := AccessRestricted (r1);

  { Passing a restricted object to unrestricted formal parameter is ok }
  r2 := AccessRestricted (r2);

  {$ifdef BUG}
  { *** The following statements are not allowed *** }
  k := r2.a;      { field access (reading) }
  r2.a := 100;    { field access (writing) }
  r1 := r2;       { assignment source is restricted }
  r2 := r1;       { assignment target is restricted }
  r1 := AccessRestricted (r2); { assigning a restricted function
                                 result to an unrestricted object }
  i  := 16#ffff;  { assignment target is restricted }
  k  := i + 2;    { arithmetic with restricted value }
  {$endif}
end.