← board

apps/ide/eliah/main.pas:1431EliahForm.Win.Caption: no Win member exists

Found while verifying bug-pascal-array-of-pointer-deref-loses-the-record-type (a Track A compiler fix): once that fix landed, apps/ide/eliah/main.pas gets past the plist[j]^.Kind line it was previously blocked on (line 784) and compilation now progresses much further into the file, but stops at a second, unrelated wall:

pascal26:1431: error: "Win": no such member on this record/class
  near:  if Length  EliahForm  >>> Win  Caption
    { status title reflects the open design + node count }
    EliahForm.UpdateTitle;
    if Length(EliahForm.Win.Caption) = 0 then begin writeln('SMOKE FAIL: title empty'); Halt(1); end;

EliahForm is a TEliahForm = class(TForm) (apps/ide/eliah/main.pas:60). Neither TForm (lib/pcl/forms.pas) nor any class in its chain (TWinControl, TControl in lib/pcl/controls.pas) declares a Win field or property — Caption lives directly on TControl, so this line likely should just be EliahForm.Caption (a stray .Win that was never valid), or Win was meant to be a real property that was never added. Grepped the whole tree for .Win. / property Win in lib/pcl/** and apps/** — no other use exists anywhere, so this is not an established PCL pattern being missed by the compiler.

This blocks tools/gui_suite.sh reaching a green eliah_ide -- compile step (the Gate on the ticket above named that as a goal); once this is fixed, re-run tools/gui_suite.sh to confirm the eliah IDE build is fully green.

Not Track A

Confirmed this is not a compiler bug: the member genuinely doesn't exist on any class in the hierarchy anywhere in lib/pcl or apps/ide/garin. This is an app-level bug in apps/ide/eliah/main.pas itself (or a missing PCL feature it was written against) — file-owned by Track B (apps built with pxx are Track E, file-owned by B) per CLAUDE.md's Track E note.

Resolved 2026-08-02 (commit 0542f35a4) — option (a), and the code says so rather than the odds

The ticket offered (a) drop .Win or (b) add a real Win property, and reasoned that (a) was "more likely given no other reference exists". The deciding evidence is one line up rather than an absence: UpdateTitle, the procedure the smoke check is verifying, ends with

  Self.Caption := s;        { apps/ide/eliah/main.pas:631 }

So the value the check wants is on Caption itself. EliahForm.Win.Caption would have been reading a different thing even if Win existed — (b) would have made it compile and still assert nothing useful. Changed to EliahForm.Caption.

Confirmed: main.pas compiles (it needs -Fuapps/ide/garin for the shared buffer/runner units, as tools/gui_suite.sh does), and eliah --smoke prints SMOKE OK, which is the step this ticket said it was blocking.

Suggested fix direction

Read apps/ide/eliah/main.pas around line 1431 and its git history / any sibling .Win usage (there is none) to decide: (a) drop .Win and just call EliahForm.Caption, or (b) if Win is meant to be a distinct wrapped-window object, add the property. (a) is more likely given no other reference exists.

Log