]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.0.1557: test failures for unreachable code v9.0.1557
authorBram Moolenaar <Bram@vim.org>
Sun, 14 May 2023 20:38:12 +0000 (21:38 +0100)
committerBram Moolenaar <Bram@vim.org>
Sun, 14 May 2023 20:38:12 +0000 (21:38 +0100)
Problem:    Test failures for unreachable code.
Solution:   Add a test override to ignore unreachable code.

runtime/doc/testing.txt
src/globals.h
src/testdir/test_vim9_script.vim
src/testing.c
src/version.c
src/vim9cmds.c
src/vim9compile.c

index 26f1a8f9e30474bfde9d87e0d707462e08950b68..97faea04641ebf5faba566bf35ed7a6474b8ce6f 100644 (file)
@@ -369,6 +369,7 @@ test_override({name}, {val})                                *test_override()*
                             string is detected
                ui_delay     time in msec to use in ui_delay(); overrules a
                             wait time of up to 3 seconds for messages
+               unreachable  no error for code after `:throw` and `:return`
                uptime       overrules sysinfo.uptime
                vterm_title  setting the window title by a job running in a
                             terminal window
@@ -378,13 +379,18 @@ test_override({name}, {val})                              *test_override()*
                "starting" is to be used when a test should behave like
                startup was done.  Since the tests are run by sourcing a
                script the "starting" variable is non-zero. This is usually a
-               good thing (tests run faster), but sometimes changes behavior
-               in a way that the test doesn't work properly.
+               good thing (tests run faster), but sometimes this changes
+               behavior in a way that the test doesn't work properly.
                When using: >
                        call test_override('starting', 1)
 <              The value of "starting" is saved.  It is restored by: >
                        call test_override('starting', 0)
 
+<              To make sure the flag is reset later using `:defer` can be
+               useful: >
+                       call test_override('unreachable', 1)
+                       defer call test_override('unreachable', 0)
+
 <              Can also be used as a |method|: >
                        GetOverrideVal()-> test_override('starting')
 
index 3e8b7532e023665a9708a3c147fc390464088f95..69b4343d611af37de3a18756ec2d552764e911a2 100644 (file)
@@ -1914,6 +1914,7 @@ EXTERN int  disable_vterm_title_for_testing INIT(= FALSE);
 EXTERN long override_sysinfo_uptime INIT(= -1);
 EXTERN int  override_autoload INIT(= FALSE);
 EXTERN int  ml_get_alloc_lines INIT(= FALSE);
+EXTERN int  ignore_unreachable_code_for_testing INIT(= FALSE);
 
 EXTERN int  in_free_unref_items INIT(= FALSE);
 #endif
index 3541aa7421f3fc3f7a37eedf9f4c583352697f9a..d6be8cb693cae80c06a4a2368a9aa25d93e7f7ae 100644 (file)
@@ -490,7 +490,7 @@ def Test_try_catch_throw()
   try # comment
     add(l, '1')
     throw 'wrong'
-    add(l, '2')
+    add(l, '2')  # "unreachable code"
   catch # comment
     add(l, v:exception)
   finally # comment
@@ -503,7 +503,7 @@ def Test_try_catch_throw()
     try
       add(l, '1')
       throw 'wrong'
-      add(l, '2')
+      add(l, '2')  # "unreachable code"
     catch /right/
       add(l, v:exception)
     endtry
@@ -754,7 +754,7 @@ def Test_try_catch_throw()
     var ret = 5
     try
       throw 'getout'
-      return -1
+      return -1 # "unreachable code"
     catch /getout/
       # ret is evaluated here
       return ret
@@ -1082,7 +1082,12 @@ enddef
 def DeletedFunc(): list<any>
   return ['delete me']
 enddef
-defcompile
+defcompile DeletedFunc
+
+call test_override('unreachable', 1)
+defcompile Test_try_catch_throw
+call test_override('unreachable', 0)
+
 delfunc DeletedFunc
 
 def s:ThrowFromDef()
@@ -1128,7 +1133,7 @@ def Test_try_catch_nested()
   try
     l->add('1')
     throw 'bad'
-    l->add('x')
+    l->add('x')  # "unreachable code"
   catch /bad/
     l->add('2')
     try
@@ -1168,6 +1173,10 @@ def Test_try_catch_nested()
   assert_equal(['1', '2', '3', '4'], l)
 enddef
 
+call test_override('unreachable', 1)
+defcompile Test_try_catch_nested
+call test_override('unreachable', 0)
+
 def s:TryOne(): number
   try
     return 0
index dfa9c606a0c65b7a268964bfc6630ae5cdd5ebc2..fd55927dfbf83b69bb69d69db3f6d2c7e61fa718 100644 (file)
@@ -1039,6 +1039,8 @@ f_test_override(typval_T *argvars, typval_T *rettv UNUSED)
        no_wait_return = val;
     else if (STRCMP(name, (char_u *)"ui_delay") == 0)
        ui_delay_for_testing = val;
+    else if (STRCMP(name, (char_u *)"unreachable") == 0)
+       ignore_unreachable_code_for_testing = val;
     else if (STRCMP(name, (char_u *)"term_props") == 0)
        reset_term_props_on_termresponse = val;
     else if (STRCMP(name, (char_u *)"vterm_title") == 0)
index c0c1ca0d9385eb723739ba84345d502d3472e7b3..cf91da553617d06c23d22fd561f17822098690c4 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1557,
 /**/
     1556,
 /**/
index bc01cd83dac715b25d735bad47295e94decec89a..c3c900a5befeed61e73c933fa7cf4414a5b3e39a 100644 (file)
@@ -1578,7 +1578,8 @@ compile_catch(char_u *arg, cctx_T *cctx UNUSED)
        return NULL;
     }
 
-    if (scope->se_u.se_try.ts_caught_all)
+    if (scope->se_u.se_try.ts_caught_all
+                                      && !ignore_unreachable_code_for_testing)
     {
        emsg(_(e_catch_unreachable_after_catch_all));
        return NULL;
index b894c6f29f18eb9475d3bf74263d2dfa4655d20b..03a6e2c275a1ceee8c415a9fa18477a16e4eedac 100644 (file)
@@ -3493,7 +3493,8 @@ compile_def_function(
                && ea.cmdidx != CMD_endwhile
                && ea.cmdidx != CMD_catch
                && ea.cmdidx != CMD_finally
-               && ea.cmdidx != CMD_endtry)
+               && ea.cmdidx != CMD_endtry
+               && !ignore_unreachable_code_for_testing)
        {
            emsg(_(e_unreachable_code_after_return));
            goto erret;