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')) | ||||
|  | ||||
|   " Error in default argument expression | ||||
|   let l =<< trim END | ||||
|     func F1(x = y) | ||||
|       return a:x * 2 | ||||
|     endfunc | ||||
|     echo F1() | ||||
|   END | ||||
|   let @a = l->join("\n") | ||||
|   call assert_fails("exe @a", 'E121:') | ||||
|   func! s:f(x = s:undefined) | ||||
|     return a:x | ||||
|   endfunc | ||||
|   call assert_fails('echo s:f()', ['E121: Undefined variable: s:undefined', | ||||
|         \ 'E121: Undefined variable: a:x']) | ||||
|  | ||||
|   func! s:f(x = s:undefined) abort | ||||
|     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 | ||||
|  | ||||
| func s:addFoo(lead) | ||||
|  | ||||
| @ -3275,7 +3275,7 @@ call_user_func( | ||||
|     save_did_emsg = did_emsg; | ||||
|     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; | ||||
| 	retval = FCERR_FAILED; | ||||
|  | ||||
| @ -704,6 +704,8 @@ static char *(features[]) = | ||||
|  | ||||
| static int included_patches[] = | ||||
| {   /* Add new patch number below this line */ | ||||
| /**/ | ||||
|     1195, | ||||
| /**/ | ||||
|     1194, | ||||
| /**/ | ||||
|  | ||||
		Reference in New Issue
	
	Block a user