diff src/ex_eval.c @ 27948:f57b8db06f26 v8.2.4499

patch 8.2.4499: Vim9: at the script level declarations leak to next block Commit: https://github.com/vim/vim/commit/28bf649a5732ffe5a47951b5e437b765cebc5b38 Author: Bram Moolenaar <Bram@vim.org> Date: Thu Mar 3 15:11:20 2022 +0000 patch 8.2.4499: Vim9: at the script level declarations leak to next block Problem: Vim9: at the script level declarations leak from try block to catch and finally block. Solution: End the block and start a new one. (closes #9883)
author Bram Moolenaar <Bram@vim.org>
date Thu, 03 Mar 2022 16:15:03 +0100
parents 41e0dcf38521
children fae7d94220e3
line wrap: on
line diff
--- a/src/ex_eval.c
+++ b/src/ex_eval.c
@@ -1827,6 +1827,16 @@ ex_catch(exarg_T *eap)
 	    cstack->cs_flags[idx] |= CSF_ACTIVE | CSF_CAUGHT;
 	    did_emsg = got_int = did_throw = FALSE;
 	    catch_exception((except_T *)cstack->cs_exception[idx]);
+
+	    if (cstack->cs_idx >= 0
+			       && (cstack->cs_flags[cstack->cs_idx] & CSF_TRY))
+	    {
+		// Variables declared in the previous block can no longer be
+		// used.
+		leave_block(cstack);
+		enter_block(cstack);
+	    }
+
 	    // It's mandatory that the current exception is stored in the cstack
 	    // so that it can be discarded at the next ":catch", ":finally", or
 	    // ":endtry" or when the catch clause is left by a ":continue",
@@ -1930,6 +1940,15 @@ ex_finally(exarg_T *eap)
 	     */
 	    cleanup_conditionals(cstack, CSF_TRY, FALSE);
 
+	    if (cstack->cs_idx >= 0
+			       && (cstack->cs_flags[cstack->cs_idx] & CSF_TRY))
+	    {
+		// Variables declared in the previous block can no longer be
+		// used.
+		leave_block(cstack);
+		enter_block(cstack);
+	    }
+
 	    /*
 	     * Make did_emsg, got_int, did_throw pending.  If set, they overrule
 	     * a pending ":continue", ":break", ":return", or ":finish".  Then