From 007f9d6ed597bd212acb95be9d0767c97d2a1438 Mon Sep 17 00:00:00 2001
From: Bram Moolenaar <Bram@vim.org>
Date: Mon, 6 Jul 2020 23:04:49 +0200
Subject: [PATCH] patch 8.2.1149: Vim9: :eval command not handled properly

Problem:    Vim9: :eval command not handled properly.
Solution:   Compile the :eval command. (closes #6408)
---
 src/testdir/test_vim9_cmd.vim | 15 +++++++++++++++
 src/version.c                 |  2 ++
 src/vim9compile.c             | 28 ++++++++++++++--------------
 3 files changed, 31 insertions(+), 14 deletions(-)

diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim
index d7c01aae97..14af261713 100644
--- a/src/testdir/test_vim9_cmd.vim
+++ b/src/testdir/test_vim9_cmd.vim
@@ -248,5 +248,20 @@ def Test_bar_after_command()
   endif
 enddef
 
+def Test_eval_command()
+  let from = 3
+  let to = 5
+  g:val = 111
+  def Increment(nrs: list<number>)
+    for nr in nrs
+      g:val += nr
+    endfor
+  enddef
+  eval range(from, to)
+        ->Increment()
+  assert_equal(111 + 3 + 4 + 5, g:val)
+  unlet g:val
+enddef
+
 
 " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
diff --git a/src/version.c b/src/version.c
index 867eaf55f2..3c8b1431c5 100644
--- a/src/version.c
+++ b/src/version.c
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1149,
 /**/
     1148,
 /**/
diff --git a/src/vim9compile.c b/src/vim9compile.c
index c876da0751..ff6668fe46 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -3852,7 +3852,6 @@ compile_expr7(
 			char_u *start = skipwhite(*arg + 1);
 
 			// Find out what comes after the arguments.
-			// TODO: pass getline function
 			ret = get_function_args(&start, '-', NULL,
 					   NULL, NULL, NULL, TRUE, NULL, NULL);
 			if (ret != FAIL && *start == '>')
@@ -6990,21 +6989,12 @@ compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx)
 	    }
 
 	    // Expression or function call.
-	    if (ea.cmdidx == CMD_eval)
+	    if (ea.cmdidx != CMD_eval)
 	    {
-		p = ea.cmd;
-		if (compile_expr0(&p, &cctx) == FAIL)
-		    goto erret;
-
-		// drop the return value
-		generate_instr_drop(&cctx, ISN_DROP, 1);
-
-		line = skipwhite(p);
-		continue;
+		// CMD_let cannot happen, compile_assignment() above is used
+		iemsg("Command from find_ex_command() not handled");
+		goto erret;
 	    }
-	    // CMD_let cannot happen, compile_assignment() above is used
-	    iemsg("Command from find_ex_command() not handled");
-	    goto erret;
 	}
 
 	p = skipwhite(p);
@@ -7124,6 +7114,16 @@ compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx)
 		    line = compile_throw(p, &cctx);
 		    break;
 
+	    case CMD_eval:
+		    if (compile_expr0(&p, &cctx) == FAIL)
+			goto erret;
+
+		    // drop the return value
+		    generate_instr_drop(&cctx, ISN_DROP, 1);
+
+		    line = skipwhite(p);
+		    break;
+
 	    case CMD_echo:
 	    case CMD_echon:
 	    case CMD_execute:
-- 
GitLab