diff --git a/vlib/v/ast/ast.v b/vlib/v/ast/ast.v index 1630d2936d..08cb640fb3 100644 --- a/vlib/v/ast/ast.v +++ b/vlib/v/ast/ast.v @@ -338,9 +338,10 @@ pub: pub struct ForStmt { pub: - cond Expr - stmts []Stmt - pos token.Position + cond Expr + stmts []Stmt + pos token.Position + is_inf bool // `for {}` } pub struct ForInStmt { diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index ecd008798e..37282cbcd4 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -273,7 +273,7 @@ fn (c mut Checker) stmt(node ast.Stmt) { typ := c.expr(it.cond) // typ_sym := c.table.get_type_symbol(typ) // if typ_sym.kind != .bool { - if table.type_idx(typ) != table.bool_type_idx { + if !it.is_inf && table.type_idx(typ) != table.bool_type_idx { c.error('non-bool used as for condition', it.pos) } for stmt in it.stmts { diff --git a/vlib/v/parser/parser.v b/vlib/v/parser/parser.v index 60ffa8d47b..632667117e 100644 --- a/vlib/v/parser/parser.v +++ b/vlib/v/parser/parser.v @@ -56,7 +56,7 @@ pub fn parse_stmt(text string, table &table.Table, scope &ast.Scope) ast.Stmt { pref: &pref.Preferences{} scope: scope // scope: &ast.Scope{start_pos: 0, parent: 0} - + } p.init_parse_fns() p.read_first_token() @@ -91,7 +91,6 @@ pub fn parse_file(path string, table &table.Table) ast.File { for p.tok.kind == .key_import { imports << p.import_stmt() } - // TODO: import only mode for { // res := s.scan() @@ -321,7 +320,7 @@ pub fn (p mut Parser) stmt() ast.Stmt { return ast.ExprStmt{ expr: expr // typ: typ - + } } } @@ -893,11 +892,13 @@ fn (p mut Parser) for_statement() ast.Stmt { // defer { p.close_scope() } // Infinite loop if p.tok.kind == .lcbr { + pos := p.tok.position() stmts := p.parse_block() p.close_scope() return ast.ForStmt{ stmts: stmts - pos: p.tok.position() + pos: pos + is_inf: true } } else if p.tok.kind == .key_mut { @@ -1063,10 +1064,10 @@ fn (p mut Parser) if_expr() ast.Expr { stmts: stmts else_stmts: else_stmts // typ: typ - + pos: p.tok.position() // left: left - + } return node } @@ -1451,10 +1452,10 @@ fn (p mut Parser) var_decl() ast.VarDecl { node := ast.VarDecl{ name: name expr: expr // p.expr(token.lowest_prec) - + is_mut: is_mut // typ: typ - + pos: p.tok.position() } p.scope.register_var(node) @@ -1573,7 +1574,7 @@ fn (p mut Parser) match_expr() ast.Expr { blocks: blocks match_exprs: match_exprs // typ: typ - + cond: cond } return node