]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.1593: Confusing error when compiling incomplete try block v9.1.1593
authorHirohito Higashi <h.east.727@gmail.com>
Tue, 5 Aug 2025 18:03:36 +0000 (20:03 +0200)
committerChristian Brabandt <cb@256bit.org>
Tue, 5 Aug 2025 18:03:36 +0000 (20:03 +0200)
Problem:  Confusing error when compiling incomplete try block
          (lacygoill)
Solution: Give better error messages (Hirohito Higashi)

fixes: #17833
closes: #17853

Signed-off-by: Hirohito Higashi <h.east.727@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
src/testdir/test_vim9_script.vim
src/version.c
src/vim9compile.c

index 8e968d6efb8ea589a2962ee3bfa6ab054b95da6d..76fc36eb1c5f814ff04bf9d230d3ed9e86072083 100644 (file)
@@ -1426,6 +1426,31 @@ def Test_try_catch_fails()
   v9.CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
   v9.CheckDefFailure(['if 1', 'endtry'], 'E171:')
   v9.CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
+  v9.CheckDefFailure(['try'], 'E600:')
+  v9.CheckDefFailure(['try', 'echo 0'], 'E600:')
+  v9.CheckDefFailure(['try', 'echo 0', 'catch'], 'E600:')
+  v9.CheckDefFailure(['try', 'echo 0', 'catch', 'echo 1'], 'E600:')
+  v9.CheckDefFailure(['try', 'echo 0', 'catch', 'echo 1', 'finally'], 'E600:')
+  v9.CheckDefFailure(['try', 'echo 0', 'catch', 'echo 1', 'finally', 'echo 2'], 'E600:')
+
+  # Missing :endtry inside a nested :try
+  var outer1 =<< trim END
+      try
+        echo 0
+      catch
+        echo 1
+  END
+  var outer2 =<< trim END
+      finally
+        echo 2
+      endtry
+  END
+  v9.CheckDefFailure(outer1 + ['try'] + outer2, 'E600:')
+  v9.CheckDefFailure(outer1 + ['try', 'echo 10'] + outer2, 'E600:')
+  v9.CheckDefFailure(outer1 + ['try', 'echo 10', 'catch'] + outer2, 'E600:')
+  v9.CheckDefFailure(outer1 + ['try', 'echo 10', 'catch', 'echo 11'] + outer2, 'E600:')
+  v9.CheckDefFailure(outer1 + ['try', 'echo 10', 'catch', 'echo 11', 'finally'] + outer2, 'E607:')
+  v9.CheckDefFailure(outer1 + ['try', 'echo 10', 'catch', 'echo 11', 'finally', 'echo 12'] + outer2, 'E607:')
 
   v9.CheckDefFailure(['throw'], 'E1143:')
   v9.CheckDefFailure(['throw xxx'], 'E1001:')
index fecf9219f08b69bb03e6a5ed6be03638f3913fe7..ea483004f2bbdb6f455f11fe32b665861b0b0a57 100644 (file)
@@ -719,6 +719,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1593,
 /**/
     1592,
 /**/
index f9998ceff2e53df3889356e6f85926492147af80..65e0ff194388373eb14037aa0ae02c86351edaf3 100644 (file)
@@ -4800,15 +4800,32 @@ compile_dfunc_scope_end_missing(cctx_T *cctx)
     if (cctx->ctx_scope == NULL)
        return FALSE;
 
-    if (cctx->ctx_scope->se_type == IF_SCOPE)
-       emsg(_(e_missing_endif));
-    else if (cctx->ctx_scope->se_type == WHILE_SCOPE)
-       emsg(_(e_missing_endwhile));
-    else if (cctx->ctx_scope->se_type == FOR_SCOPE)
-       emsg(_(e_missing_endfor));
-    else
-       emsg(_(e_missing_rcurly));
-
+    switch (cctx->ctx_scope->se_type)
+    {
+       case IF_SCOPE:
+           emsg(_(e_missing_endif));
+           break;
+       case WHILE_SCOPE:
+           emsg(_(e_missing_endwhile));
+           break;
+       case FOR_SCOPE:
+           emsg(_(e_missing_endfor));
+           break;
+       case TRY_SCOPE:
+           emsg(_(e_missing_endtry));
+           break;
+       case BLOCK_SCOPE:
+           // end block scope from :try (maybe)
+           compile_endblock(cctx);
+           if (cctx->ctx_scope != NULL
+                   && cctx->ctx_scope->se_type == TRY_SCOPE)
+               emsg(_(e_missing_endtry));
+           else
+               emsg(_(e_missing_rcurly));
+           break;
+       default:
+           emsg(_(e_missing_rcurly));
+    }
     return TRUE;
 }