From: Francis De Brabandere <francisdb@gmail.com> Windows VBScript skips the rest of a colon-separated line after On Error Resume Next catches an error, so the saved_err assignments after a failing comparison were never reached and saved_err was left undefined for the subsequent assertion. Each "x = (...) : saved_err = ... : err.clear" is now three separate statements, and saved_err is declared explicitly. --- dlls/vbscript/tests/lang.vbs | 89 ++++++++++++++++++++++++++---------- 1 file changed, 64 insertions(+), 25 deletions(-) diff --git a/dlls/vbscript/tests/lang.vbs b/dlls/vbscript/tests/lang.vbs index 3b03a4c06e8..acc4c981125 100644 --- a/dlls/vbscript/tests/lang.vbs +++ b/dlls/vbscript/tests/lang.vbs @@ -234,15 +234,25 @@ Call ok(not ("5" < CCur(10)), """5"" < CCur(10) should be false (lex)") Dim saved_err on error resume next err.clear -x = ("abc" = 5.5) : saved_err = err.number : err.clear +x = ("abc" = 5.5) +saved_err = err.number +err.clear Call todo_wine_ok(saved_err = 13, "literal R8: ""abc"" = 5.5 should error 13 (got " & saved_err & "; needs literal tracking)") -x = ("abc" = 1e2) : saved_err = err.number : err.clear +x = ("abc" = 1e2) +saved_err = err.number +err.clear Call todo_wine_ok(saved_err = 13, "literal sci: ""abc"" = 1e2 should error 13 (got " & saved_err & "; needs literal tracking)") -x = ("abc" = &hff) : saved_err = err.number : err.clear +x = ("abc" = &hff) +saved_err = err.number +err.clear Call ok(saved_err = 13, "literal hex: ""abc"" = &hff should error 13 (got " & saved_err & ")") -x = ("abc" = 100000) : saved_err = err.number : err.clear +x = ("abc" = 100000) +saved_err = err.number +err.clear Call ok(saved_err = 13, "literal I4: ""abc"" = 100000 should error 13 (got " & saved_err & ")") -x = ("abc" = #1/15/2024#): saved_err = err.number : err.clear +x = ("abc" = #1/15/2024#) +saved_err = err.number +err.clear Call todo_wine_ok(saved_err = 13, "literal date: ""abc"" = #1/15/2024# should error 13 (got " & saved_err & "; needs literal tracking)") on error goto 0 @@ -253,25 +263,37 @@ on error goto 0 ' and raise error 13 — these stay todo_wine until the literal-tracking work ' lands. We wrap each block in "on error resume next" so the script doesn't ' abort on the unwanted error. -Dim n5 : n5 = 5 -Dim n10 : n10 = 10 +Dim n5 +n5 = 5 +Dim n10 +n10 = 10 on error resume next err.clear -x = ("abc" = n5) : saved_err = err.number : err.clear +x = ("abc" = n5) +saved_err = err.number +err.clear Call todo_wine_ok(saved_err = 0, "var: ""abc"" = (n=5) should not raise (got " & saved_err & ")") err.clear -x = ("abc" = n5) : Call todo_wine_ok(err.number = 0 and not x, "var: ""abc"" = (n=5) should be false") +x = ("abc" = n5) +Call todo_wine_ok(err.number = 0 and not x, "var: ""abc"" = (n=5) should be false") +err.clear +x = ("010" = n10) +Call todo_wine_ok(err.number = 0 and not x, "var: ""010"" = (n=10) should be false (string)") err.clear -x = ("010" = n10) : Call todo_wine_ok(err.number = 0 and not x, "var: ""010"" = (n=10) should be false (string)") +x = ("abc" = (5+0)) +saved_err = err.number err.clear -x = ("abc" = (5+0)) : saved_err = err.number : err.clear Call todo_wine_ok(saved_err = 0, "arith: ""abc"" = (5+0) should not raise (got " & saved_err & ")") err.clear -x = ("010" = (5+5)) : Call todo_wine_ok(err.number = 0 and not x, "arith: ""010"" = (5+5) should be false") +x = ("010" = (5+5)) +Call todo_wine_ok(err.number = 0 and not x, "arith: ""010"" = (5+5) should be false") err.clear -x = ("010" = (10*1)) : Call todo_wine_ok(err.number = 0 and not x, "arith: ""010"" = (10*1) should be false") +x = ("010" = (10*1)) +Call todo_wine_ok(err.number = 0 and not x, "arith: ""010"" = (10*1) should be false") +err.clear +x = ("abc" = -5) +saved_err = err.number err.clear -x = ("abc" = -5) : saved_err = err.number : err.clear Call todo_wine_ok(saved_err = 0, "neg: ""abc"" = -5 should not raise (got " & saved_err & ")") on error goto 0 @@ -285,16 +307,21 @@ Call ok(not ("010" = CSng(10)), "CSng: ""010"" = CSng(10) should be false") Call ok(not ("010" = CDbl(10)), "CDbl: ""010"" = CDbl(10) should be false") on error resume next err.clear -x = ("abc" = CInt(5)) : saved_err = err.number : err.clear +x = ("abc" = CInt(5)) +saved_err = err.number +err.clear Call todo_wine_ok(saved_err = 0, "CInt: ""abc"" = CInt(5) should not raise (got " & saved_err & ")") +x = ("abc" = CLng(5)) +saved_err = err.number err.clear -x = ("abc" = CLng(5)) : saved_err = err.number : err.clear Call todo_wine_ok(saved_err = 0, "CLng: ""abc"" = CLng(5) should not raise (got " & saved_err & ")") +x = ("abc" = CSng(5)) +saved_err = err.number err.clear -x = ("abc" = CSng(5)) : saved_err = err.number : err.clear Call ok(saved_err = 0, "CSng: ""abc"" = CSng(5) should not raise (got " & saved_err & ")") +x = ("abc" = CDbl(5)) +saved_err = err.number err.clear -x = ("abc" = CDbl(5)) : saved_err = err.number : err.clear Call ok(saved_err = 0, "CDbl: ""abc"" = CDbl(5) should not raise (got " & saved_err & ")") on error goto 0 @@ -304,10 +331,13 @@ Call ok(not ("10" > CSng(5)), """10"" > CSng(5) should be false (lex)") Call ok(not ("9" < CDbl(10)), """9"" < CDbl(10) should be false (lex)") ' --- VT_DATE from CDate is non-literal: string compare, no error. --- -Dim cdt : cdt = CDate("2024-01-15") +Dim cdt +cdt = CDate("2024-01-15") on error resume next err.clear -x = ("abc" = cdt) : saved_err = err.number : err.clear +x = ("abc" = cdt) +saved_err = err.number +err.clear on error goto 0 Call ok(saved_err = 0, "CDate: ""abc"" = CDate(...) should not raise (got " & saved_err & ")") @@ -317,7 +347,9 @@ Function GetFiveLit() End Function on error resume next err.clear -x = ("abc" = GetFiveLit()) : saved_err = err.number : err.clear +x = ("abc" = GetFiveLit()) +saved_err = err.number +err.clear on error goto 0 Call todo_wine_ok(saved_err = 0, "fn return: ""abc"" = GetFiveLit() should not raise (got " & saved_err & ")") @@ -325,7 +357,9 @@ Sub TestByValStripsLit(ByVal v) Dim local_err on error resume next err.clear - x = ("abc" = v) : local_err = err.number : err.clear + x = ("abc" = v) + local_err = err.number + err.clear on error goto 0 Call todo_wine_ok(local_err = 0, "ByVal: ""abc"" = v should not raise (got " & local_err & ")") End Sub @@ -335,11 +369,14 @@ Sub TestByRefStripsLit(ByRef v) Dim local_err on error resume next err.clear - x = ("abc" = v) : local_err = err.number : err.clear + x = ("abc" = v) + local_err = err.number + err.clear on error goto 0 Call todo_wine_ok(local_err = 0, "ByRef: ""abc"" = v should not raise (got " & local_err & ")") End Sub -Dim litvar : litvar = 5 +Dim litvar +litvar = 5 TestByRefStripsLit litvar ' --- Const inlines at compile-time in Wine, so the value is treated as a @@ -348,7 +385,9 @@ TestByRefStripsLit litvar Const FIVE_C = 5 on error resume next err.clear -x = ("abc" = FIVE_C) : saved_err = err.number : err.clear +x = ("abc" = FIVE_C) +saved_err = err.number +err.clear on error goto 0 Call todo_wine_ok(saved_err = 0, "Const: ""abc"" = FIVE should not raise (got " & saved_err & "; needs compile-time fix)") -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10766