From: Francis De Brabandere <francisdb@gmail.com> Replace FIXME stubs in the lexer with proper error reporting using lex_error(). Date literal errors (unterminated, newline inside, invalid date) now report VBSE_SYNTAX_ERROR (1002). Invalid line continuation (underscore not followed by newline) now reports VBSE_INVALID_CHAR (1032). --- dlls/vbscript/lex.c | 16 ++++++++-------- dlls/vbscript/tests/run.c | 24 ++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/dlls/vbscript/lex.c b/dlls/vbscript/lex.c index b95dd011211..2857e8668f3 100644 --- a/dlls/vbscript/lex.c +++ b/dlls/vbscript/lex.c @@ -211,6 +211,7 @@ static int parse_string_literal(parser_ctx_t *ctx, const WCHAR **ret) static int parse_date_literal(parser_ctx_t *ctx, DATE *ret) { + const WCHAR *start = ctx->ptr; const WCHAR *ptr = ++ctx->ptr; WCHAR *rptr; int len = 0; @@ -218,8 +219,8 @@ static int parse_date_literal(parser_ctx_t *ctx, DATE *ret) while(ctx->ptr < ctx->end) { if(*ctx->ptr == '\n' || *ctx->ptr == '\r') { - FIXME("newline inside date literal\n"); - return 0; + ctx->ptr = start; + return lex_error(ctx, MAKE_VBSERROR(VBSE_SYNTAX_ERROR)); } if(*ctx->ptr == '#') @@ -228,8 +229,8 @@ static int parse_date_literal(parser_ctx_t *ctx, DATE *ret) } if(ctx->ptr == ctx->end) { - FIXME("unterminated date literal\n"); - return 0; + ctx->ptr = start; + return lex_error(ctx, MAKE_VBSERROR(VBSE_SYNTAX_ERROR)); } len += ctx->ptr-ptr; @@ -243,8 +244,8 @@ static int parse_date_literal(parser_ctx_t *ctx, DATE *ret) res = VarDateFromStr(rptr, ctx->lcid, 0, ret); free(rptr); if (FAILED(res)) { - FIXME("Invalid date literal\n"); - return 0; + ctx->ptr = start; + return lex_error(ctx, MAKE_VBSERROR(VBSE_SYNTAX_ERROR)); } ctx->ptr++; @@ -547,8 +548,7 @@ int parser_lex(void *lval, unsigned *loc, parser_ctx_t *ctx) if(ret == '_') { skip_spaces(ctx); if(*ctx->ptr != '\n' && *ctx->ptr != '\r') { - FIXME("'_' not followed by newline\n"); - return 0; + return lex_error(ctx, MAKE_VBSERROR(VBSE_INVALID_CHAR)); } if(*ctx->ptr == '\r') ctx->ptr++; diff --git a/dlls/vbscript/tests/run.c b/dlls/vbscript/tests/run.c index d3aebff098a..da6f31ff4df 100644 --- a/dlls/vbscript/tests/run.c +++ b/dlls/vbscript/tests/run.c @@ -3025,6 +3025,30 @@ static void test_parse_errors(void) L"Class C\nDefault Private Function f()\nf = 1\nEnd Function\nEnd Class\n", 1, 0, NULL, S_OK, 1057 + }, + { + /* Unterminated date literal */ + L"x = #1/1/2000\n", + 0, 4, + NULL, S_OK, 1002 + }, + { + /* Newline inside date literal */ + L"x = #1/1/\n2000#\n", + 0, 4, + NULL, S_OK, 1002 + }, + { + /* Invalid date literal */ + L"x = #notadate#\n", + 0, 4, + NULL, S_OK, 1002 + }, + { + /* '_' not followed by newline */ + L"x = 1 _x\n", + 0, 7, + NULL, S_OK, 1032 } }; HRESULT hres; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10501