aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2026-02-02 10:54:49 +0000
committergingerBill <gingerBill@users.noreply.github.com>2026-02-02 10:56:30 +0000
commit8a92ba74fc90b70f56af5e0dcfd37c16aab94595 (patch)
treed0d6d19389119f0d6cdbd83ee351fd1e0659e9bf /src
parent74347f3069972a7580c0bf2d4f3b1b65eb940cc5 (diff)
Make `defer_use_checked` and `where_clauses_evaluated` atomic
Diffstat (limited to 'src')
-rw-r--r--src/check_decl.cpp8
-rw-r--r--src/checker.hpp12
-rw-r--r--src/llvm_backend_proc.cpp2
3 files changed, 11 insertions, 11 deletions
diff --git a/src/check_decl.cpp b/src/check_decl.cpp
index 8019d00c3..22a74f370 100644
--- a/src/check_decl.cpp
+++ b/src/check_decl.cpp
@@ -2155,7 +2155,7 @@ gb_internal bool check_proc_body(CheckerContext *ctx_, Token token, DeclInfo *de
rw_mutex_unlock(&ctx->scope->mutex);
- bool where_clause_ok = evaluate_where_clauses(ctx, nullptr, decl->scope, &decl->proc_lit->ProcLit.where_clauses, !decl->where_clauses_evaluated);
+ bool where_clause_ok = evaluate_where_clauses(ctx, nullptr, decl->scope, &decl->proc_lit->ProcLit.where_clauses, !decl->where_clauses_evaluated.load(std::memory_order_relaxed));
if (!where_clause_ok) {
// NOTE(bill, 2019-08-31): Don't check the body as the where clauses failed
return false;
@@ -2173,15 +2173,15 @@ gb_internal bool check_proc_body(CheckerContext *ctx_, Token token, DeclInfo *de
}
GB_ASSERT(decl->proc_checked_state != ProcCheckedState_Checked);
- if (decl->defer_use_checked) {
+ if (decl->defer_use_checked.load(std::memory_order_relaxed)) {
GB_ASSERT(is_type_polymorphic(type, true));
error(token, "Defer Use Checked: %.*s", LIT(decl->entity.load()->token.string));
- GB_ASSERT(decl->defer_use_checked == false);
+ GB_ASSERT(decl->defer_use_checked.load(std::memory_order_relaxed) == false);
}
check_stmt_list(ctx, bs->stmts, Stmt_CheckScopeDecls);
- decl->defer_use_checked = true;
+ decl->defer_use_checked.store(true, std::memory_order_relaxed);
for (Ast *stmt : bs->stmts) {
if (stmt->kind == Ast_ValueDecl) {
diff --git a/src/checker.hpp b/src/checker.hpp
index f9c279a51..7ca50d593 100644
--- a/src/checker.hpp
+++ b/src/checker.hpp
@@ -221,14 +221,14 @@ struct DeclInfo {
Entity * para_poly_original;
- bool is_using;
- bool where_clauses_evaluated;
- bool foreign_require_results;
+ bool is_using;
+ bool foreign_require_results;
+ std::atomic<bool> where_clauses_evaluated;
std::atomic<ProcCheckedState> proc_checked_state;
- BlockingMutex proc_checked_mutex;
- isize defer_used;
- bool defer_use_checked;
+ BlockingMutex proc_checked_mutex;
+ isize defer_used;
+ std::atomic<bool> defer_use_checked;
CommentGroup *comment;
CommentGroup *docs;
diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp
index 837d7ce48..dc502717e 100644
--- a/src/llvm_backend_proc.cpp
+++ b/src/llvm_backend_proc.cpp
@@ -676,7 +676,7 @@ gb_internal void lb_begin_procedure_body(lbProcedure *p) {
lbAddr res = {};
if (p->entity && p->entity->decl_info &&
- p->entity->decl_info->defer_use_checked &&
+ p->entity->decl_info->defer_use_checked.load(std::memory_order_relaxed) &&
p->entity->decl_info->defer_used == 0) {
// NOTE(bill): this is a bodge to get around the issue of the problem BELOW