From: Francis De Brabandere <francisdb@gmail.com> --- dlls/vbscript/tests/lang.vbs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/dlls/vbscript/tests/lang.vbs b/dlls/vbscript/tests/lang.vbs index 1b6cdf763e4..be80ca2b51a 100644 --- a/dlls/vbscript/tests/lang.vbs +++ b/dlls/vbscript/tests/lang.vbs @@ -534,6 +534,34 @@ 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. +todo_wine_ok 0 = ("1" And "2"), """1"" And ""2"" is not 0" +todo_wine_ok 1 = ("5" And "3"), """5"" And ""3"" is not 1" +todo_wine_ok getVT("1" And "2") = "VT_I4", "getVT(""1"" And ""2"") = " & getVT("1" And "2") +todo_wine_ok 3 = ("1" Or "2"), """1"" Or ""2"" is not 3" +todo_wine_ok 7 = ("5" Or "3"), """5"" Or ""3"" is not 7" +todo_wine_ok getVT("1" Or "2") = "VT_I4", "getVT(""1"" Or ""2"") = " & getVT("1" Or "2") +todo_wine_ok -2 = ("1" Imp "2"), """1"" Imp ""2"" is not -2" +todo_wine_ok getVT("1" Imp "2") = "VT_I4", "getVT(""1"" Imp ""2"") = " & getVT("1" Imp "2") + +' Mixed BSTR + numeric stays Long. +Call ok((5 And "3") = 1, "5 And ""3"" is not 1") +Call ok(("5" And 3) = 1, """5"" And 3 is not 1") +todo_wine_ok getVT(5 And "3") = "VT_I4", "getVT(5 And ""3"") = " & getVT(5 And "3") + +' BSTR with non-numeric content falls back to Boolean conversion, which +' fails with type mismatch for arbitrary text. +Sub testLogicalBstrErr + Dim r + on error resume next + 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