mirror of
				https://github.com/vim/vim.git
				synced 2025-10-30 09:47:20 -04:00 
			
		
		
		
	patch 9.1.1195: inside try-block: fn body executed with default arg undefined
Problem:  inside try-block: fn body executed when default arg is
          undefined
Solution: When inside a try-block do not execute function body after an
          error in evaluating a default argument expression
          (Shane Harper).
closes: #16865
Signed-off-by: Shane Harper <shane@shaneharper.net>
Signed-off-by: Christian Brabandt <cb@256bit.org>
			
			
This commit is contained in:
		
				
					committed by
					
						 Christian Brabandt
						Christian Brabandt
					
				
			
			
				
	
			
			
			
						parent
						
							7db96134c2
						
					
				
				
					commit
					2d18789aa6
				
			| @@ -161,14 +161,35 @@ func Test_default_arg() | |||||||
| 	\ execute('func Args2')) | 	\ execute('func Args2')) | ||||||
|  |  | ||||||
|   " Error in default argument expression |   " Error in default argument expression | ||||||
|   let l =<< trim END |   func! s:f(x = s:undefined) | ||||||
|     func F1(x = y) |     return a:x | ||||||
|       return a:x * 2 |   endfunc | ||||||
|     endfunc |   call assert_fails('echo s:f()', ['E121: Undefined variable: s:undefined', | ||||||
|     echo F1() |         \ 'E121: Undefined variable: a:x']) | ||||||
|   END |  | ||||||
|   let @a = l->join("\n") |   func! s:f(x = s:undefined) abort | ||||||
|   call assert_fails("exe @a", 'E121:') |     return a:x | ||||||
|  |   endfunc | ||||||
|  |   const expected_error = 'E121: Undefined variable: s:undefined' | ||||||
|  |   " Only one error should be output; execution of the function should be aborted | ||||||
|  |   " after the default argument expression error. | ||||||
|  |   call assert_fails('echo s:f()', [expected_error, expected_error]) | ||||||
|  | endfunc | ||||||
|  |  | ||||||
|  | func Test_default_argument_expression_error_while_inside_of_a_try_block() | ||||||
|  |   func! s:f(v = s:undefined_variable) | ||||||
|  |     let s:entered_fn_body = 1 | ||||||
|  |     return a:v | ||||||
|  |   endfunc | ||||||
|  |  | ||||||
|  |   unlet! s:entered_fn_body | ||||||
|  |   try | ||||||
|  |     call s:f() | ||||||
|  |     throw "No exception." | ||||||
|  |   catch | ||||||
|  |     call assert_exception("E121: Undefined variable: s:undefined_variable") | ||||||
|  |   endtry | ||||||
|  |   call assert_false(exists('s:entered_fn_body'), "exists('s:entered_fn_body')") | ||||||
| endfunc | endfunc | ||||||
|  |  | ||||||
| func s:addFoo(lead) | func s:addFoo(lead) | ||||||
|   | |||||||
| @@ -3275,7 +3275,7 @@ call_user_func( | |||||||
|     save_did_emsg = did_emsg; |     save_did_emsg = did_emsg; | ||||||
|     did_emsg = FALSE; |     did_emsg = FALSE; | ||||||
|  |  | ||||||
|     if (default_arg_err && (fp->uf_flags & FC_ABORT)) |     if (default_arg_err && (fp->uf_flags & FC_ABORT || trylevel > 0 )) | ||||||
|     { |     { | ||||||
| 	did_emsg = TRUE; | 	did_emsg = TRUE; | ||||||
| 	retval = FCERR_FAILED; | 	retval = FCERR_FAILED; | ||||||
|   | |||||||
| @@ -704,6 +704,8 @@ static char *(features[]) = | |||||||
|  |  | ||||||
| static int included_patches[] = | static int included_patches[] = | ||||||
| {   /* Add new patch number below this line */ | {   /* Add new patch number below this line */ | ||||||
|  | /**/ | ||||||
|  |     1195, | ||||||
| /**/ | /**/ | ||||||
|     1194, |     1194, | ||||||
| /**/ | /**/ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user