checker: check if BranchStmt is in a loop
							parent
							
								
									fd75cce0f3
								
							
						
					
					
						commit
						fe0942043c
					
				|  | @ -31,6 +31,7 @@ mut: | |||
| 	//assigned_var_name string
 | ||||
| 	// fn_decl        ast.FnDecl
 | ||||
| 	pref           &pref.Preferences // Preferences shared from V struct
 | ||||
| 	in_for_count   int // if checker is currently in an for loop
 | ||||
| } | ||||
| 
 | ||||
| pub fn new_checker(table &table.Table, pref &pref.Preferences) Checker { | ||||
|  | @ -597,6 +598,11 @@ fn (c mut Checker) stmt(node ast.Stmt) { | |||
| 		ast.Block { | ||||
| 			c.stmts(it.stmts) | ||||
| 		} | ||||
| 		ast.BranchStmt { | ||||
| 			if c.in_for_count == 0 { | ||||
| 				c.error('$it.tok.lit statement not within a loop', it.tok.position()) | ||||
| 			} | ||||
| 		} | ||||
| 		// ast.Attr {}
 | ||||
| 		ast.CompIf { | ||||
| 			// c.expr(it.cond)
 | ||||
|  | @ -660,6 +666,7 @@ fn (c mut Checker) stmt(node ast.Stmt) { | |||
| 			c.stmts(it.stmts) | ||||
| 		} | ||||
| 		ast.ForStmt { | ||||
| 			c.in_for_count++ | ||||
| 			typ := c.expr(it.cond) | ||||
| 			if !it.is_inf && table.type_idx(typ) != table.bool_type_idx { | ||||
| 				c.error('non-bool used as for condition', it.pos) | ||||
|  | @ -667,15 +674,19 @@ fn (c mut Checker) stmt(node ast.Stmt) { | |||
| 			// TODO: update loop var type
 | ||||
| 			// how does this work currenly?
 | ||||
| 			c.stmts(it.stmts) | ||||
| 			c.in_for_count-- | ||||
| 		} | ||||
| 		ast.ForCStmt { | ||||
| 			c.in_for_count++ | ||||
| 			c.stmt(it.init) | ||||
| 			c.expr(it.cond) | ||||
| 			// c.stmt(it.inc)
 | ||||
| 			c.expr(it.inc) | ||||
| 			c.stmts(it.stmts) | ||||
| 			c.in_for_count-- | ||||
| 		} | ||||
| 		ast.ForInStmt { | ||||
| 			c.in_for_count++ | ||||
| 			typ := c.expr(it.cond) | ||||
| 			if it.is_range { | ||||
| 				c.expr(it.high) | ||||
|  | @ -690,7 +701,7 @@ fn (c mut Checker) stmt(node ast.Stmt) { | |||
| 						} | ||||
| 						else { | ||||
| 							table.int_type} | ||||
| 	} | ||||
| 					} | ||||
| 					it.key_type = key_type | ||||
| 					scope.update_var_type(it.key_var, key_type) | ||||
| 				} | ||||
|  | @ -705,6 +716,7 @@ fn (c mut Checker) stmt(node ast.Stmt) { | |||
| 				scope.update_var_type(it.val_var, value_type) | ||||
| 			} | ||||
| 			c.stmts(it.stmts) | ||||
| 			c.in_for_count-- | ||||
| 		} | ||||
| 		ast.GoStmt{ | ||||
| 			c.expr(it.call_expr) | ||||
|  |  | |||
|  | @ -379,7 +379,7 @@ pub fn (s mut Scanner) scan() token.Token { | |||
| 		// Check if not .eof to prevent panic
 | ||||
| 		next_char := if s.pos + 1 < s.text.len { s.text[s.pos + 1] } else { `\0` } | ||||
| 		if token.is_key(name) { | ||||
| 			return s.new_token(token.key_to_token(name), '') | ||||
| 			return s.new_token(token.key_to_token(name), name) | ||||
| 		} | ||||
| 		// 'asdf $b' => "b" is the last name in the string, dont start parsing string
 | ||||
| 		// at the next ', skip it
 | ||||
|  | @ -1019,7 +1019,7 @@ pub fn (s &Scanner) error(msg string) { | |||
| 	pos := token.Position{ | ||||
| 		line_nr: s.line_nr | ||||
| 		pos: s.pos | ||||
| 	}	  | ||||
| 	} | ||||
| 	eprintln(util.formated_error('error', msg, s.file_path, pos)) | ||||
| 	exit(1) | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue