aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2018-05-27 13:49:55 +0100
committergingerBill <bill@gingerbill.org>2018-05-27 13:49:55 +0100
commit86cf9383ea5a15cbc3b41f4e3b5a3ee160a04f64 (patch)
treef5585ebc10b8f9ed26f2b4682189b4f364b06149
parent307977d4cf6a2b0bd2004bd9facbab00d1e5cb57 (diff)
Fix delayed assert collection
-rw-r--r--build.bat2
-rw-r--r--core/thread/thread_windows.odin (renamed from core/thread/thread.odin)1
-rw-r--r--examples/demo/demo.odin2
-rw-r--r--src/array.cpp5
-rw-r--r--src/checker.cpp35
5 files changed, 16 insertions, 29 deletions
diff --git a/build.bat b/build.bat
index 32e67af1e..f51dde9cc 100644
--- a/build.bat
+++ b/build.bat
@@ -42,7 +42,7 @@ del *.ilk > NUL 2> NUL
cl %compiler_settings% "src\main.cpp" ^
/link %linker_settings% -OUT:%exe_name% ^
- && odin run examples/demo/demo.odin
+ && odin check examples/demo/demo.odin
del *.obj > NUL 2> NUL
diff --git a/core/thread/thread.odin b/core/thread/thread_windows.odin
index 2289c6bc6..adf59b898 100644
--- a/core/thread/thread.odin
+++ b/core/thread/thread_windows.odin
@@ -1,6 +1,5 @@
package thread
-#assert(ODIN_OS == "windows");
import "core:sys/win32"
Thread_Proc :: #type proc(^Thread) -> int;
diff --git a/examples/demo/demo.odin b/examples/demo/demo.odin
index abd788120..8e3842e23 100644
--- a/examples/demo/demo.odin
+++ b/examples/demo/demo.odin
@@ -1,7 +1,5 @@
package main
-#assert(_BUFFER_SIZE > 0);
-
import "core:fmt"
import "core:strconv"
import "core:mem"
diff --git a/src/array.cpp b/src/array.cpp
index 6809574df..c28463c1b 100644
--- a/src/array.cpp
+++ b/src/array.cpp
@@ -54,7 +54,10 @@ gb_inline void array_init(Array<T> *array, gbAllocator const &a, isize count) {
template <typename T>
gb_inline void array_init(Array<T> *array, gbAllocator const &a, isize count, isize capacity) {
array->allocator = a;
- array->data = gb_alloc_array(a, T, capacity);
+ array->data = nullptr;
+ if (capacity > 0) {
+ array->data = gb_alloc_array(a, T, capacity);
+ }
array->count = count;
array->capacity = capacity;
}
diff --git a/src/checker.cpp b/src/checker.cpp
index 51689d027..4d1b2c46a 100644
--- a/src/checker.cpp
+++ b/src/checker.cpp
@@ -215,7 +215,7 @@ bool decl_info_has_init(DeclInfo *d) {
Scope *create_scope(Scope *parent, gbAllocator allocator) {
Scope *s = gb_alloc_item(allocator, Scope);
s->parent = parent;
- map_init(&s->elements, heap_allocator());
+ map_init(&s->elements, heap_allocator());
ptr_set_init(&s->implicit, heap_allocator());
ptr_set_init(&s->imported, heap_allocator());
ptr_set_init(&s->exported, heap_allocator());
@@ -2119,6 +2119,16 @@ void check_collect_entities(Checker *c, Array<AstNode *> nodes) {
for_array(decl_index, nodes) {
AstNode *decl = nodes[decl_index];
if (!is_ast_node_decl(decl) && !is_ast_node_when_stmt(decl)) {
+
+ if (c->context.scope->is_file && decl->kind == AstNode_ExprStmt) {
+ AstNode *expr = decl->ExprStmt.expr;
+ if (expr->kind == AstNode_CallExpr &&
+ expr->CallExpr.proc->kind == AstNode_BasicDirective &&
+ expr->CallExpr.proc->BasicDirective.name == "assert") {
+ array_add(&c->context.scope->delayed_asserts, expr);
+ continue;
+ }
+ }
continue;
}
@@ -2158,18 +2168,6 @@ void check_collect_entities(Checker *c, Array<AstNode *> nodes) {
check_add_foreign_block_decl(c, decl);
case_end;
-
- case_ast_node(ce, CallExpr, decl);
- if (c->context.scope->is_file &&
- ce->proc->kind == AstNode_BasicDirective &&
- ce->proc->BasicDirective.name == "assert") {
- array_add(&c->context.scope->delayed_asserts, decl);
- } else {
- goto error_case;
- }
- case_end;
-
- error_case:
default:
if (c->context.scope->is_file) {
error(decl, "Only declarations are allowed at file scope");
@@ -2709,17 +2707,6 @@ void check_import_entities(Checker *c) {
GB_ASSERT(node->scope->is_package);
AstPackage *p = node->scope->package;
-
-
- for_array(i, p->files.entries) {
- AstFile *f = p->files.entries[i].value;
-
- CheckerContext prev_context = c->context;
- defer (c->context = prev_context);
- add_curr_ast_file(c, f);
- check_collect_entities(c, f->decls);
- }
-
for_array(i, p->files.entries) {
AstFile *f = p->files.entries[i].value;
CheckerContext prev_context = c->context;