# HG changeset patch # User Bram Moolenaar # Date 1597423505 -7200 # Node ID 0706bd071fa3f10363b6b5d6454ad447464639d5 # Parent 4eb35250b54eb3c08adcd144bffa50adef6d6d52 patch 8.2.1446: Vim9: line number in error message is not correct Commit: https://github.com/vim/vim/commit/7517ffdbb564250de72ee3ef64fecf4a486df519 Author: Bram Moolenaar Date: Fri Aug 14 18:35:07 2020 +0200 patch 8.2.1446: Vim9: line number in error message is not correct Problem: Vim9: line number in error message is not correct. Solution: Set SOURCING_LNUM before calling emsg(). (closes https://github.com/vim/vim/issues/6708) diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim --- a/src/testdir/test_vim9_func.vim +++ b/src/testdir/test_vim9_func.vim @@ -1045,6 +1045,7 @@ def Test_error_reporting() call writefile(lines, 'Xdef') try source Xdef + assert_report('should have failed') catch /E476:/ assert_match('Invalid command: invalid', v:exception) assert_match(', line 3$', v:throwpoint) @@ -1064,11 +1065,30 @@ def Test_error_reporting() call writefile(lines, 'Xdef') try source Xdef + assert_report('should have failed') catch /E476:/ assert_match('Invalid command: invalid', v:exception) assert_match(', line 4$', v:throwpoint) endtry + lines =<< trim END + vim9script + def Func() + let db = #{foo: 1, bar: 2} + # comment + let x = db.asdf + enddef + defcompile + Func() + END + call writefile(lines, 'Xdef') + try + source Xdef + assert_report('should have failed') + catch /E716:/ + assert_match('_Func, line 3$', v:throwpoint) + endtry + call delete('Xdef') enddef diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -755,6 +755,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1446, +/**/ 1445, /**/ 1444, diff --git a/src/vim9execute.c b/src/vim9execute.c --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -1027,6 +1027,7 @@ call_def_function( tv = STACK_TV_BOT(idx - count); if (tv->v_type == VAR_CHANNEL || tv->v_type == VAR_JOB) { + SOURCING_LNUM = iptr->isn_lnum; emsg(_(e_inval_string)); break; } @@ -1121,6 +1122,7 @@ call_def_function( if (di == NULL) { + SOURCING_LNUM = iptr->isn_lnum; semsg(_(e_undefvar), name); goto on_error; } @@ -1169,6 +1171,7 @@ call_def_function( if (di == NULL) { + SOURCING_LNUM = iptr->isn_lnum; semsg(_("E121: Undefined variable: %c:%s"), namespace, iptr->isn_arg.string); goto on_error; @@ -1326,6 +1329,7 @@ call_def_function( clear_tv(tv); if (msg != NULL) { + SOURCING_LNUM = iptr->isn_lnum; emsg(_(msg)); goto on_error; } @@ -1421,6 +1425,7 @@ call_def_function( lidx = list->lv_len + lidx; if (lidx < 0 || lidx > list->lv_len) { + SOURCING_LNUM = iptr->isn_lnum; semsg(_(e_listidx), lidx); goto on_error; } @@ -1457,6 +1462,7 @@ call_def_function( if (dict == NULL) { + SOURCING_LNUM = iptr->isn_lnum; emsg(_(e_dictionary_not_set)); goto on_error; } @@ -1586,6 +1592,7 @@ call_def_function( item = dict_find(dict, tv->vval.v_string, -1); if (item != NULL) { + SOURCING_LNUM = iptr->isn_lnum; semsg(_(e_duplicate_key), tv->vval.v_string); dict_unref(dict); goto on_error; @@ -1749,6 +1756,7 @@ call_def_function( if (tv->v_type == VAR_PARTIAL) { // TODO: use a garray_T on ectx. + SOURCING_LNUM = iptr->isn_lnum; emsg("Multiple closures not supported yet"); goto failed; } @@ -1852,6 +1860,7 @@ call_def_function( case ISN_PUSHEXC: if (current_exception == NULL) { + SOURCING_LNUM = iptr->isn_lnum; iemsg("Evaluating catch while current_exception is NULL"); goto failed; } @@ -2175,7 +2184,8 @@ call_def_function( case EXPR_DIV: f1 = f1 / f2; break; case EXPR_SUB: f1 = f1 - f2; break; case EXPR_ADD: f1 = f1 + f2; break; - default: emsg(_(e_modulus)); + default: SOURCING_LNUM = iptr->isn_lnum; + emsg(_(e_modulus)); goto on_error; } clear_tv(tv1); @@ -2228,6 +2238,7 @@ call_def_function( tv = STACK_TV_BOT(-2); if (tv->v_type != VAR_STRING) { + SOURCING_LNUM = iptr->isn_lnum; emsg(_(e_stringreq)); goto on_error; } @@ -2236,6 +2247,7 @@ call_def_function( tv = STACK_TV_BOT(-1); if (tv->v_type != VAR_NUMBER) { + SOURCING_LNUM = iptr->isn_lnum; emsg(_(e_number_exp)); goto on_error; } @@ -2266,6 +2278,7 @@ call_def_function( tv = STACK_TV_BOT(-2); if (tv->v_type != VAR_LIST) { + SOURCING_LNUM = iptr->isn_lnum; emsg(_(e_listreq)); goto on_error; } @@ -2274,6 +2287,7 @@ call_def_function( tv = STACK_TV_BOT(-1); if (tv->v_type != VAR_NUMBER) { + SOURCING_LNUM = iptr->isn_lnum; emsg(_(e_number_exp)); goto on_error; } @@ -2281,6 +2295,7 @@ call_def_function( clear_tv(tv); if ((li = list_find(list, n)) == NULL) { + SOURCING_LNUM = iptr->isn_lnum; semsg(_(e_listidx), n); goto on_error; } @@ -2354,6 +2369,7 @@ call_def_function( if ((di = dict_find(dict, key, -1)) == NULL) { + SOURCING_LNUM = iptr->isn_lnum; semsg(_(e_dictkey), key); goto on_error; } @@ -2378,6 +2394,7 @@ call_def_function( tv = STACK_TV_BOT(-1); if (tv->v_type != VAR_DICT || tv->vval.v_dict == NULL) { + SOURCING_LNUM = iptr->isn_lnum; emsg(_(e_dictreq)); goto on_error; } @@ -2386,6 +2403,7 @@ call_def_function( if ((di = dict_find(dict, iptr->isn_arg.string, -1)) == NULL) { + SOURCING_LNUM = iptr->isn_lnum; semsg(_(e_dictkey), iptr->isn_arg.string); goto on_error; } @@ -2405,6 +2423,7 @@ call_def_function( #endif ) { + SOURCING_LNUM = iptr->isn_lnum; emsg(_(e_number_exp)); goto on_error; } @@ -2441,6 +2460,7 @@ call_def_function( || (tv->v_type == VAR_FUNC && ct->ct_type == VAR_PARTIAL))) { + SOURCING_LNUM = iptr->isn_lnum; semsg(_("E1029: Expected %s but got %s"), vartype_name(ct->ct_type), vartype_name(tv->v_type)); @@ -2461,6 +2481,7 @@ call_def_function( || (list->lv_len > min_len && !iptr->isn_arg.checklen.cl_more_OK)) { + SOURCING_LNUM = iptr->isn_lnum; semsg(_("E1093: Expected %d items but got %d"), min_len, list == NULL ? 0 : list->lv_len); goto on_error;