aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/check_decl.cpp5
-rw-r--r--src/check_expr.cpp3
-rw-r--r--src/checker.cpp7
-rw-r--r--src/checker.hpp4
4 files changed, 18 insertions, 1 deletions
diff --git a/src/check_decl.cpp b/src/check_decl.cpp
index f0059424e..e28861fc6 100644
--- a/src/check_decl.cpp
+++ b/src/check_decl.cpp
@@ -1608,7 +1608,10 @@ gb_internal bool check_proc_body(CheckerContext *ctx_, Token token, DeclInfo *de
check_scope_usage(ctx->checker, ctx->scope);
- add_deps_from_child_to_parent(decl);
+ if (decl->entity == nullptr) {
+ // Only care about nested procedure literals
+ add_deps_from_child_to_parent(decl);
+ }
return true;
}
diff --git a/src/check_expr.cpp b/src/check_expr.cpp
index c1fa21dc4..52efd9a66 100644
--- a/src/check_expr.cpp
+++ b/src/check_expr.cpp
@@ -9455,6 +9455,9 @@ gb_internal ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast
pl->decl = decl;
check_procedure_later(ctx.checker, ctx.file, empty_token, decl, type, pl->body, pl->tags);
+ mutex_lock(&ctx.checker->nested_proc_lits_mutex);
+ array_add(&ctx.checker->nested_proc_lits, decl);
+ mutex_unlock(&ctx.checker->nested_proc_lits_mutex);
}
check_close_scope(&ctx);
diff --git a/src/checker.cpp b/src/checker.cpp
index 6d73348d1..7be3c71d1 100644
--- a/src/checker.cpp
+++ b/src/checker.cpp
@@ -1256,6 +1256,7 @@ gb_internal void init_checker(Checker *c) {
// NOTE(bill): 1 Mi elements should be enough on average
array_init(&c->procs_to_check, heap_allocator(), 0, 1<<20);
+ array_init(&c->nested_proc_lits, heap_allocator(), 0, 1<<20);
mpsc_init(&c->global_untyped_queue, a); // , 1<<20);
@@ -1267,6 +1268,7 @@ gb_internal void destroy_checker(Checker *c) {
destroy_checker_context(&c->builtin_ctx);
+ array_free(&c->nested_proc_lits);
array_free(&c->procs_to_check);
mpsc_destroy(&c->global_untyped_queue);
}
@@ -5657,6 +5659,11 @@ gb_internal void check_walk_all_dependencies(DeclInfo *decl) {
}
gb_internal void check_update_dependency_tree_for_procedures(Checker *c) {
+ mutex_lock(&c->nested_proc_lits_mutex);
+ for (DeclInfo *decl : c->nested_proc_lits) {
+ check_walk_all_dependencies(decl);
+ }
+ mutex_unlock(&c->nested_proc_lits_mutex);
for (Entity *e : c->info.entities) {
DeclInfo *decl = e->decl_info;
check_walk_all_dependencies(decl);
diff --git a/src/checker.hpp b/src/checker.hpp
index 595618e1d..d461b1f6e 100644
--- a/src/checker.hpp
+++ b/src/checker.hpp
@@ -449,6 +449,10 @@ struct Checker {
MPSCQueue<Entity *> procs_with_deferred_to_check;
Array<ProcInfo *> procs_to_check;
+ BlockingMutex nested_proc_lits_mutex;
+ Array<DeclInfo *> nested_proc_lits;
+
+
MPSCQueue<UntypedExprInfo> global_untyped_queue;
};