]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.2.3858: Vim9: not enough tests v8.2.3858
authorBram Moolenaar <Bram@vim.org>
Mon, 20 Dec 2021 10:55:35 +0000 (10:55 +0000)
committerBram Moolenaar <Bram@vim.org>
Mon, 20 Dec 2021 10:55:35 +0000 (10:55 +0000)
Problem:    Vim9: not enough tests.
Solution:   Add tests for :try/:catch and :redir. Add missing type check.

src/testdir/test_vim9_cmd.vim
src/testdir/test_vim9_script.vim
src/version.c
src/vim9compile.c

index 6e01d9975663e6b98e9601d60394c62fddf0b80a..2d86b6ba3b6e03db024d31c97ae1d76b819239af 100644 (file)
@@ -1558,6 +1558,23 @@ def Test_redir_to_var()
     redir END
   END
   CheckDefFailure(lines, 'E1141:')
+
+  lines =<< trim END
+      var text: string
+      redir => text
+        echo 'hello'
+        redir > Xfile
+      redir END
+  END
+  CheckDefFailure(lines, 'E1185:')
+
+  lines =<< trim END
+      var text: number
+      redir => text
+        echo 'hello'
+      redir END
+  END
+  CheckDefFailure(lines, 'E1012:')
 enddef
 
 def Test_echo_void()
index c9ceccf0d8cf8cd3f5f184bbc4b7daeaab9c4f4b..af80935ab9b74efc2b921792dcf2ea4b43edfffc 100644 (file)
@@ -611,15 +611,49 @@ def Test_try_catch_throw()
   # no requirement for spaces before |
   try|echo 0|catch|endtry
 
+  # return in try with finally
+  def ReturnInTry(): number
+    var ret = 4
+    try
+      return ret
+    catch /this/
+      return -1
+    catch /that/
+      return -1
+    finally
+      # changing ret has no effect
+      ret = 7
+    endtry
+    return -2
+  enddef
+  assert_equal(4, ReturnInTry())
+
+  # return in catch with finally
+  def ReturnInCatch(): number
+    var ret = 5
+    try
+      throw 'getout'
+      return -1
+    catch /getout/
+      # ret is evaluated here
+      return ret
+    finally
+      # changing ret later has no effect
+      ret = -3
+    endtry
+    return -2
+  enddef
+  assert_equal(5, ReturnInCatch())
+
   # return in finally after empty catch
   def ReturnInFinally(): number
     try
     finally
-      return 4
+      return 6
     endtry
-    return 2
+    return -1
   enddef
-  assert_equal(4, ReturnInFinally())
+  assert_equal(6, ReturnInFinally())
 
   var lines =<< trim END
       vim9script
index b3121d15d2247eb14926395647514b307f2002c7..a7f372dd620e8b5bd9d69f63be08591d03ddf64a 100644 (file)
@@ -749,6 +749,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3858,
 /**/
     3857,
 /**/
index 8ef1faf3a4961b863cda3ef7f68b2d1bae7dfd7d..2b27f514cddfe77fa216461bb11643418af9162f 100644 (file)
@@ -8651,7 +8651,7 @@ compile_endblock(cctx_T *cctx)
 }
 
 /*
- * compile "try"
+ * Compile "try".
  * Creates a new scope for the try-endtry, pointing to the first catch and
  * finally.
  * Creates another scope for the "try" block itself.
@@ -8722,7 +8722,7 @@ compile_try(char_u *arg, cctx_T *cctx)
 }
 
 /*
- * compile "catch {expr}"
+ * Compile "catch {expr}".
  */
     static char_u *
 compile_catch(char_u *arg, cctx_T *cctx UNUSED)
@@ -9477,8 +9477,8 @@ compile_substitute(char_u *arg, exarg_T *eap, cctx_T *cctx)
     static char_u *
 compile_redir(char_u *line, exarg_T *eap, cctx_T *cctx)
 {
-    char_u *arg = eap->arg;
-    lhs_T      *lhs = &cctx->ctx_redir_lhs;
+    char_u  *arg = eap->arg;
+    lhs_T   *lhs = &cctx->ctx_redir_lhs;
 
     if (lhs->lhs_name != NULL)
     {
@@ -9534,6 +9534,9 @@ compile_redir(char_u *line, exarg_T *eap, cctx_T *cctx)
        if (compile_assign_lhs(arg, lhs, CMD_redir,
                                                FALSE, FALSE, 1, cctx) == FAIL)
            return NULL;
+       if (need_type(&t_string, lhs->lhs_member_type,
+                                           -1, 0, cctx, FALSE, FALSE) == FAIL)
+           return NULL;
        generate_instr(cctx, ISN_REDIRSTART);
        lhs->lhs_append = append;
        if (lhs->lhs_has_index)