parser: disallow indexing on next line at top-level (#8128)
							parent
							
								
									4044abef0e
								
							
						
					
					
						commit
						8ee67d1c1c
					
				| 
						 | 
				
			
			@ -390,7 +390,9 @@ fn (mut p Parser) fn_decl() ast.FnDecl {
 | 
			
		|||
	no_body := p.tok.kind != .lcbr
 | 
			
		||||
	body_start_pos := p.peek_tok.position()
 | 
			
		||||
	if p.tok.kind == .lcbr {
 | 
			
		||||
		p.inside_fn = true
 | 
			
		||||
		stmts = p.parse_block_no_scope(true)
 | 
			
		||||
		p.inside_fn = false
 | 
			
		||||
	}
 | 
			
		||||
	if !no_body && are_args_type_only {
 | 
			
		||||
		p.error_with_pos('functions with type only args can not have bodies', body_start_pos)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -41,7 +41,7 @@ mut:
 | 
			
		|||
	inside_ct_if_expr bool
 | 
			
		||||
	inside_or_expr    bool
 | 
			
		||||
	inside_for        bool
 | 
			
		||||
	inside_fn         bool
 | 
			
		||||
	inside_fn         bool // true even with implicit main
 | 
			
		||||
	inside_str_interp bool
 | 
			
		||||
	or_is_handled     bool         // ignore `or` in this expression
 | 
			
		||||
	builtin_mod       bool         // are we in the `builtin` module?
 | 
			
		||||
| 
						 | 
				
			
			@ -532,6 +532,7 @@ pub fn (mut p Parser) top_stmt() ast.Stmt {
 | 
			
		|||
				return p.comment_stmt()
 | 
			
		||||
			}
 | 
			
		||||
			else {
 | 
			
		||||
				p.inside_fn = true
 | 
			
		||||
				if p.pref.is_script && !p.pref.is_test {
 | 
			
		||||
					mut stmts := []ast.Stmt{}
 | 
			
		||||
					for p.tok.kind != .eof {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -286,7 +286,7 @@ pub fn (mut p Parser) expr_with_left(left ast.Expr, precedence int, is_stmt_iden
 | 
			
		|||
				return node
 | 
			
		||||
			}
 | 
			
		||||
			p.is_stmt_ident = is_stmt_ident
 | 
			
		||||
		} else if p.tok.kind == .lsbr {
 | 
			
		||||
		} else if p.tok.kind == .lsbr && (p.inside_fn || p.tok.line_nr == p.prev_tok.line_nr) {
 | 
			
		||||
			node = p.index_expr(node)
 | 
			
		||||
			p.is_stmt_ident = is_stmt_ident
 | 
			
		||||
			if p.tok.kind == .lpar && p.tok.line_nr == p.prev_tok.line_nr && node is ast.IndexExpr {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,22 @@
 | 
			
		|||
// must not parse 4[deprecated] as index expression
 | 
			
		||||
const x = 4
 | 
			
		||||
[deprecated]
 | 
			
		||||
fn g() {
 | 
			
		||||
	a := [3]
 | 
			
		||||
	// indexing is currently allowed on next line
 | 
			
		||||
	_ = a
 | 
			
		||||
	[0]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const y = 5
 | 
			
		||||
[deprecated]
 | 
			
		||||
fn h() {}
 | 
			
		||||
 | 
			
		||||
const z = 6
 | 
			
		||||
[typedef]
 | 
			
		||||
struct C.Foo{}
 | 
			
		||||
 | 
			
		||||
// test implicit main allows indexing on next line
 | 
			
		||||
a := [3]
 | 
			
		||||
_ := a
 | 
			
		||||
[0]
 | 
			
		||||
		Loading…
	
		Reference in New Issue