← board

origin/master has advanced 4 commit(s) since this sha. Re-verify at current HEAD before acting — the callback is tagged to the sha that was tested, which may no longer be the state of the tree.

regression: lib-test#src:test/lib_classes_tthread.pas red at 459e96f985d1 (auto-filed by twatch)

Repro

tools/testmgr.py --tier full --job 'lib-test#src:test/lib_classes_tthread.pas' at 459e96f985d1588fac20836b151341cf7e967a61

Range

bad 459e96f985d1, last good 137a182ad46a, 70 commit(s) in range — the watcher narrows this by idle bisect; check tstate/TSTATE.md for the current range.

Log tail

pascal26:27: error: base type not found: TThread
(tail)
pascal26:27: error: base type not found: TThread
  near:  type TBumper  class  >>> TThread  public 

Stub ticket: signal only. Track T agent (face 2) enriches or a dev track takes it from the repro line.

Resolved 2026-08-16 — two bugs, one red (Track A/P)

Not a threading bug at all. classes.pas re-exports TThread with a unit-QUALIFIED class alias (TThread = palthreadobj.TThread;), and ParseTypeSection registered a UClass alias row only for the UNQUALIFIED form — its lookahead requires a semicolon right after the first identifier, so the qualified shape fell through to the plain type-alias path and no alias row was ever created. The re-export had always been a no-op; it was invisible only because uses was transitive, so an importer found palthreadobj's row directly through the leak. Closing the leak (2026-08-15, VisibilityAllows) is what made the dead re-export observable — which is why this reads as a regression with a 70-commit range and nothing in the range touching threads.

Second, independent gap found on the way: {$threadsafe on} set ThreadSafeMode but never defined PXX_THREADSAFE. That define is derived from the --threadsafe FLAG in PasApplyTargetDefines, at option-parse time, long before the directive is lexed — so the directive form left classes.pas's {$ifdef PXX_THREADSAFE} gate false. The flag form compiled; the directive form (what this test uses) could not.

Fixed in 341dbf99f (QualClassAliasCi + the directive define), pinned as v344 in 64e262c69 — lib-test builds on pinned, so the pin is what carries it. Records and arrays already re-exported correctly through the qualified form (verified); this was the class name table alone.

Gate: make compiler/pascal26 + tools/gate.sh quick GREEN; the test builds and prints CLASSESTHREAD OK with both the directive and the flag.