← board

Track guessed as P from the test source. The ranker reads frontmatter, so an unset track parks a stub in Track T's queue regardless of what the body says -- correct the track: line if this is wrong.

origin/master has advanced 13 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: test-core#src:test/test_variant_string_ops.pas red at df21e490d798 (auto-filed by twatch)

Repro

tools/testmgr.py --tier native --job 'test-core#src:test/test_variant_string_ops.pas' at df21e490d7989a812fc35b0f5f2dc5b5ea0e4bab

Range

bad df21e490d798, last good fd93e4a71c37, 13 commit(s) in range — the watcher narrows this by idle bisect; check tstate/TSTATE.md for the current range.

Log tail

ok: /tmp/testmgr-scratch-1397860/test_variant_string_ops26  [code=129332B  data=3248B  bss=42700B  procs=229]

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

Triaged and closed 2026-08-24 (claude-A) — the TEST was wrong, not the compiler

Reproduced at HEAD: the program dies with Runtime error: EVariantError, cannot convert string to a number at section 4, which asserts

v1 := 'abc'; v2 := 123;
writeln(v1 = v2);    { expected FALSE }
writeln(v1 <> v2);   { expected TRUE  }
writeln(v1 < v2);    { expected FALSE }
writeln(v1 > v2);    { expected FALSE }

Bisect range: the culprit is 46b7aa284, [[bug-a-a-variant-comparison-does-not-coerce-a-stringy-operand]], which made a comparison with exactly one stringy operand convert the text and compare numerically — FPC's rule, and the one the ticket was filed to get.

Checked against the oracle before touching anything, which is the whole point: fpc 3.2.2 -Mobjfpc -O1 on the same four rows does not print FALSE/TRUE/FALSE/FALSE. It raises EVariantError: Invalid variant type cast on the first one. 'abc' is not a number, so the conversion fails, and FPC lets that failure out.

So the expectation this test locked in was pxx's OLD rule — "a side whose tag is neither string nor char compares unequal, unordered" — and that rule was the defect. The compiler now agrees with FPC on both halves: '123' = 123 is True, 'abc' = 123 raises.

What changed

Green on x86-64, i386, aarch64 and arm32, and ALL OK under fpc 3.2.2.

Note for the next auto-filed regression

The stub's track: P guess was wrong — a Variant comparison rule is Track A (shared runtime + EmitVarBinOp), not the Pascal frontend. Harmless here because the same agent held both, but the guess is made from the test's file name and will keep landing Variant and RTL regressions in P.