Browse Source

Fix checking if a procedure terminates for `for` loops.

Ginger Bill 8 years ago
parent
commit
a80872b60d
2 changed files with 5 additions and 4 deletions
  1. 2 4
      src/check_stmt.c
  2. 3 0
      src/parser.c

+ 2 - 4
src/check_stmt.c

@@ -125,15 +125,13 @@ bool check_is_terminating(AstNode *node) {
 	case_end;
 
 	case_ast_node(fs, ForStmt, node);
-		if (!check_has_break(fs->body, true)) {
+		if (fs->cond == NULL && !check_has_break(fs->body, true)) {
 			return check_is_terminating(fs->body);
 		}
 	case_end;
 
 	case_ast_node(rs, RangeStmt, node);
-		if (!check_has_break(rs->body, true)) {
-			return check_is_terminating(rs->body);
-		}
+		return false;
 	case_end;
 
 	case_ast_node(ms, MatchStmt, node);

+ 3 - 0
src/parser.c

@@ -17,6 +17,8 @@ typedef enum ParseFileError {
 
 typedef Array(AstNode *) AstNodeArray;
 
+gb_global i32 global_file_id = 0;
+
 typedef struct AstFile {
 	i32            id;
 	gbArena        arena;
@@ -3639,6 +3641,7 @@ ParseFileError init_ast_file(AstFile *f, String fullpath) {
 		gb_arena_init_from_allocator(&f->arena, heap_allocator(), arena_size);
 
 		f->curr_proc = NULL;
+		f->id = ++global_file_id;
 
 		return ParseFile_None;
 	}