From: Francis De Brabandere <francisdb@gmail.com> --- dlls/vbscript/tests/lang.vbs | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/dlls/vbscript/tests/lang.vbs b/dlls/vbscript/tests/lang.vbs index 1b6cdf763e4..5ffa8546c00 100644 --- a/dlls/vbscript/tests/lang.vbs +++ b/dlls/vbscript/tests/lang.vbs @@ -534,6 +534,38 @@ Call ok(getVT(Empty Imp Null) = "VT_I4", "getVT(Empty Imp Null) = " & getVT( Call ok((Not Empty) = -1, "Not Empty is not -1") Call ok(getVT(Not Empty) = "VT_I4", "getVT(Not Empty) = " & getVT(Not Empty)) +' Logical/bitwise ops with BSTR operands coerce the string to a number when +' parseable (matching VarXor), giving a Long result instead of treating the +' string as a Boolean. +Sub testLogicalBstr + Dim r + r = "1" And "2" : todo_wine_ok r = 0, """1"" And ""2"" is not 0" + r = "5" And "3" : todo_wine_ok r = 1, """5"" And ""3"" is not 1" + r = "1" And "2" : todo_wine_ok getVT(r) = "VT_I4*", "getVT(""1"" And ""2"") = " & getVT(r) + r = "1" Or "2" : todo_wine_ok r = 3, """1"" Or ""2"" is not 3" + r = "5" Or "3" : todo_wine_ok r = 7, """5"" Or ""3"" is not 7" + r = "1" Or "2" : todo_wine_ok getVT(r) = "VT_I4*", "getVT(""1"" Or ""2"") = " & getVT(r) + r = "1" Imp "2" : todo_wine_ok r = -2, """1"" Imp ""2"" is not -2" + r = "1" Imp "2" : todo_wine_ok getVT(r) = "VT_I4*", "getVT(""1"" Imp ""2"") = " & getVT(r) + + ' Mixed BSTR + numeric stays Long. + r = 5 And "3" : call ok(r = 1, "5 And ""3"" is not 1") + r = "5" And 3 : call ok(r = 1, """5"" And 3 is not 1") + r = 5 And "3" : todo_wine_ok getVT(r) = "VT_I4*", "getVT(5 And ""3"") = " & getVT(r) +End Sub +Call testLogicalBstr + +' BSTR with non-numeric content falls back to Boolean conversion, which +' fails with type mismatch for arbitrary text. +Sub testLogicalBstrErr + on error resume next + Dim r + Err.Clear : r = "abc" And "2" : call ok(Err.Number = 13, """abc"" And ""2"" err=" & Err.Number) + Err.Clear : r = "abc" Or "2" : call ok(Err.Number = 13, """abc"" Or ""2"" err=" & Err.Number) + Err.Clear : r = "abc" Imp "2" : call ok(Err.Number = 13, """abc"" Imp ""2"" err=" & Err.Number) +End Sub +Call testLogicalBstrErr + ' Arithmetic binary ops coerce Empty to VT_I2 0 — narrower than the logical ' family — so the widening picks up whichever side has the larger numeric ' type and the result reflects that. -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10901