← board

Calling a procedural-pointer record/class field (v.Run(args))

Symptom

A record/class field of a procedural type cannot be called through field access. Reading/assigning the field is fine; invoking it is not.

type
  TCmd  = procedure(x: Integer);
  TVerb = record Word: AnsiString; Run: TCmd; end;
var v: TVerb;
begin
  v.Run := @Hello;     { OK — assign }
  v.Run(99);           { FAIL — call through the field }
end;
Expected: :=, but got:  (Kind: 74, Line: ...)
pascal26: error: unexpected token ()

The parser, after v.Run, expects an assignment (:=) rather than accepting a call argument list (...). So a proc-typed field in an l-value/member position is only handled as an assignment target, not as an indirect-call target.

Repro (no classes-as-units needed beyond builtinheap)

/tmp/nest8.pas in the nested-routines session reproduces; minimal:

program p;
type TCmd = procedure(x: Integer);
     TVerb = record Word: AnsiString; Run: TCmd; end;
procedure Hello(x: Integer); begin writeln(x); end;
var verbs: array of TVerb; v: TVerb;
begin
  SetLength(verbs, 1);
  verbs[0].Run := @Hello;
  for v in verbs do v.Run(99);   { error here }
end.

Confirmed pre-existing on the pinned stable compiler (stable_linux_amd64/default/pinned).

Where to look

Acceptance

Log