parser: support `static x := 42` in [unsafe] functions too
							parent
							
								
									276c08e7f7
								
							
						
					
					
						commit
						bdce35fd9c
					
				|  | @ -141,8 +141,8 @@ fn (mut p Parser) partial_assign_stmt(left []ast.Expr, left_comments []ast.Comme | |||
| 						iv := lx.info as ast.IdentVar | ||||
| 						share = iv.share | ||||
| 						if iv.is_static { | ||||
| 							if !p.pref.translated && !p.pref.is_fmt { | ||||
| 								p.error_with_pos('static variables are supported only in -translated mode', | ||||
| 							if !p.pref.translated && !p.pref.is_fmt && !p.inside_unsafe_fn { | ||||
| 								p.error_with_pos('static variables are supported only in -translated mode or in [unsafe] fn', | ||||
| 									lx.pos) | ||||
| 								return ast.Stmt{} | ||||
| 							} | ||||
|  | @ -154,7 +154,7 @@ fn (mut p Parser) partial_assign_stmt(left []ast.Expr, left_comments []ast.Comme | |||
| 						name: lx.name | ||||
| 						expr: if left.len == right.len { right[i] } else { ast.Expr{} } | ||||
| 						share: share | ||||
| 						is_mut: lx.is_mut || p.inside_for | ||||
| 						is_mut: lx.is_mut || p.inside_for || is_static | ||||
| 						pos: lx.pos | ||||
| 					} | ||||
| 					if p.pref.autofree { | ||||
|  |  | |||
|  | @ -361,7 +361,9 @@ fn (mut p Parser) fn_decl() ast.FnDecl { | |||
| 	body_start_pos := p.peek_tok.position() | ||||
| 	if p.tok.kind == .lcbr { | ||||
| 		p.inside_fn = true | ||||
| 		p.inside_unsafe_fn = is_unsafe | ||||
| 		stmts = p.parse_block_no_scope(true) | ||||
| 		p.inside_unsafe_fn = false | ||||
| 		p.inside_fn = false | ||||
| 	} | ||||
| 	if !no_body && are_args_type_only { | ||||
|  |  | |||
|  | @ -38,6 +38,7 @@ mut: | |||
| 	inside_or_expr    bool | ||||
| 	inside_for        bool | ||||
| 	inside_fn         bool // true even with implicit main
 | ||||
| 	inside_unsafe_fn  bool // true when in fn, marked with `[unsafe]`
 | ||||
| 	inside_str_interp bool | ||||
| 	or_is_handled     bool         // ignore `or` in this expression
 | ||||
| 	builtin_mod       bool         // are we in the `builtin` module?
 | ||||
|  |  | |||
|  | @ -0,0 +1,16 @@ | |||
| [unsafe] | ||||
| fn foo() int { | ||||
| 	static x := 42 | ||||
| 	x++ | ||||
| 	return x | ||||
| } | ||||
| 
 | ||||
| fn xfoo() int { | ||||
| 	return unsafe { foo() } | ||||
| } | ||||
| 
 | ||||
| fn test_static_vars_work() { | ||||
| 	assert xfoo() == 43 | ||||
| 	assert xfoo() == 44 | ||||
| 	assert xfoo() == 45 | ||||
| } | ||||
		Loading…
	
		Reference in New Issue