From: Francis De Brabandere <francisdb@gmail.com> When assigning with an index to a variable that is not an array or object (e.g. x(0) = 42 where x is undeclared or holds an integer), return DISP_E_TYPEMISMATCH which maps to VBS error 13 (Type mismatch), matching Windows behavior. --- dlls/vbscript/interp.c | 8 ++++---- dlls/vbscript/tests/run.c | 12 ++++++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/dlls/vbscript/interp.c b/dlls/vbscript/interp.c index 779f3f881a5..614bf812d38 100644 --- a/dlls/vbscript/interp.c +++ b/dlls/vbscript/interp.c @@ -861,8 +861,8 @@ static HRESULT assign_ident(exec_ctx_t *ctx, BSTR name, WORD flags, DISPPARAMS * } if(!(V_VT(v) & VT_ARRAY)) { - FIXME("array assign on type %d\n", V_VT(v)); - return E_FAIL; + WARN("indexed assign on type %d\n", V_VT(v)); + return DISP_E_TYPEMISMATCH; } switch(V_VT(v)) { @@ -913,8 +913,8 @@ static HRESULT assign_ident(exec_ctx_t *ctx, BSTR name, WORD flags, DISPPARAMS * VARIANT *new_var; if(arg_cnt(dp)) { - FIXME("arg_cnt %d not supported\n", arg_cnt(dp)); - return E_NOTIMPL; + WARN("indexed assign on undeclared variable %s\n", debugstr_w(name)); + return DISP_E_TYPEMISMATCH; } TRACE("creating variable %s\n", debugstr_w(name)); diff --git a/dlls/vbscript/tests/run.c b/dlls/vbscript/tests/run.c index 4b69bc18ffa..447618f9627 100644 --- a/dlls/vbscript/tests/run.c +++ b/dlls/vbscript/tests/run.c @@ -3391,6 +3391,18 @@ static void run_tests(void) parse_script_w(L"x = 1\n Call ok(x = 1, \"x = \" & x)"); + /* indexed assign to undeclared variable should give type mismatch */ + parse_script_w(L"On Error Resume Next\n" + "x(0) = 42\n" + "Call ok(Err.Number = 13, \"Err.Number = \" & Err.Number)\n"); + + /* indexed assign to non-array variable should give type mismatch */ + parse_script_w(L"On Error Resume Next\n" + "Dim z\n" + "z = 42\n" + "z(0) = 1\n" + "Call ok(Err.Number = 13, \"Err.Number = \" & Err.Number)\n"); + parse_script_w(L"x = _ \n3"); test_global_vars_ref(TRUE); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10406