One line of the big compatibility expression was missing parentheses:
(((p1.basetype = btPchar) or (p1.BaseType = btString)) and
(p2.BaseType = btWideString) or (p2.BaseType = btUnicodeString)) or
'and' binds stronger than 'or', so the (p2 = btUnicodeString) term stood
alone: ANY destination type was considered assignment-compatible with a
UnicodeString source. Since script 'string' is btUnicodeString nowadays,
these all compiled without error and only failed at runtime (or
corrupted data):
var i: Integer; s: string; ... i := s;
var b: Boolean; s: string; ... b := s;
var d: Double; s: string; ... d := s;
With the added parentheses the term applies - as clearly intended - only
to btPchar/btString destinations. String-to-string, WideString and Char
conversions keep compiling as before.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
One line of the big compatibility expression was missing parentheses:
(((p1.basetype = btPchar) or (p1.BaseType = btString)) and
(p2.BaseType = btWideString) or (p2.BaseType = btUnicodeString)) or
'and' binds stronger than 'or', so the (p2 = btUnicodeString) term stood
alone: ANY destination type was considered assignment-compatible with a
UnicodeString source. Since script 'string' is btUnicodeString nowadays,
these all compiled without error and only failed at runtime (or
corrupted data):
var i: Integer; s: string; ... i := s;
var b: Boolean; s: string; ... b := s;
var d: Double; s: string; ... d := s;
With the added parentheses the term applies - as clearly intended - only
to btPchar/btString destinations. String-to-string, WideString and Char
conversions keep compiling as before.
🤖 Generated with Claude Code