From 8a92ba74fc90b70f56af5e0dcfd37c16aab94595 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 2 Feb 2026 10:54:49 +0000 Subject: [PATCH] Make `defer_use_checked` and `where_clauses_evaluated` atomic --- src/check_decl.cpp | 8 ++++---- src/checker.hpp | 12 ++++++------ src/llvm_backend_proc.cpp | 2 +- 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 where_clauses_evaluated; std::atomic proc_checked_state; - BlockingMutex proc_checked_mutex; - isize defer_used; - bool defer_use_checked; + BlockingMutex proc_checked_mutex; + isize defer_used; + std::atomic 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