]> granicus.if.org Git - vim/commitdiff
patch 8.2.3239: Vim9: no error using heredoc for a number variable v8.2.3239
authorBram Moolenaar <Bram@vim.org>
Wed, 28 Jul 2021 19:25:49 +0000 (21:25 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 28 Jul 2021 19:25:49 +0000 (21:25 +0200)
Problem:    Vim9: no error using heredoc for a number variable.
Solution:   Add a type check. (closes #8627)

src/evalvars.c
src/testdir/test_vim9_assign.vim
src/version.c
src/vim9compile.c

index 534163c543286dc34bda113eec1d0ee323477070..dc747f717a58834e653b53482142a14f1f7f0c82 100644 (file)
@@ -817,6 +817,7 @@ ex_let(exarg_T *eap)
     else if (expr[0] == '=' && expr[1] == '<' && expr[2] == '<')
     {
        list_T  *l;
+       long    cur_lnum = SOURCING_LNUM;
 
        // HERE document
        l = heredoc_get(eap, expr + 3, FALSE);
@@ -825,6 +826,8 @@ ex_let(exarg_T *eap)
            rettv_list_set(&rettv, l);
            if (!eap->skip)
            {
+               // errors are for the assignment, not the end marker
+               SOURCING_LNUM = cur_lnum;
                op[0] = '=';
                op[1] = NUL;
                (void)ex_let_vars(eap->arg, &rettv, FALSE, semicolon, var_count,
index 03427c841db89ae4a800d784ecb0bfbf46392181..b2f8feca5cf9cd0d23a78312b50f72544e54c84f 100644 (file)
@@ -1392,6 +1392,14 @@ def Test_heredoc()
   [END]
   CheckScriptFailure(lines, 'E1145: Missing heredoc end marker: END')
   delfunc! g:Func
+
+  lines =<< trim END
+      var lines: number =<< trim STOP
+        aaa
+        bbb
+      STOP
+  END
+  CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got list<string>', 1)
 enddef
 
 def Test_var_func_call()
index 6a8f7c8af96fd2ada94648313bc4192e2e9d8f0b..b705749aab1f5e3d5878231e99046b383f734000 100644 (file)
@@ -755,6 +755,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3239,
 /**/
     3238,
 /**/
index cb00f0348486a32b2768208986a088fdd11233d7..c6a2965eae357fb11b637327021596ffeec2af96 100644 (file)
@@ -6875,7 +6875,15 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
        if (compile_assign_lhs(var_start, &lhs, cmdidx,
                                        is_decl, heredoc, oplen, cctx) == FAIL)
            goto theend;
-       if (!heredoc)
+       if (heredoc)
+       {
+           SOURCING_LNUM = start_lnum;
+           if (lhs.lhs_has_type
+                   && need_type(&t_list_string, lhs.lhs_type,
+                                           -1, 0, cctx, FALSE, FALSE) == FAIL)
+               goto theend;
+       }
+       else
        {
            if (cctx->ctx_skip == SKIP_YES)
            {