diff options
| author | gingerBill <bill@gingerbill.org> | 2021-08-19 17:38:18 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2021-08-19 17:38:18 +0100 |
| commit | 38841dd46e6bb5879200c0a8e2f879c8cfa005d6 (patch) | |
| tree | d742d0f758224110243741ae1d99f4d7e51ab3da /src/check_decl.cpp | |
| parent | e722af7f6126d821ec2847769b234ed18f61518c (diff) | |
Fix race condition from `add_entity_use` due to Entity.identifier
Diffstat (limited to 'src/check_decl.cpp')
| -rw-r--r-- | src/check_decl.cpp | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/src/check_decl.cpp b/src/check_decl.cpp index c8bacb9b2..4cce25097 100644 --- a/src/check_decl.cpp +++ b/src/check_decl.cpp @@ -350,12 +350,12 @@ void override_entity_in_scope(Entity *original_entity, Entity *new_entity) { original_entity->type = new_entity->type; original_entity->aliased_of = new_entity; - if (original_entity->identifier == nullptr) { - original_entity->identifier = new_entity->identifier; - } - if (original_entity->identifier != nullptr && - original_entity->identifier->kind == Ast_Ident) { - original_entity->identifier->Ident.entity = new_entity; + Ast *empty_ident = nullptr; + original_entity->identifier.compare_exchange_strong(empty_ident, new_entity->identifier); + + if (original_entity->identifier.load() != nullptr && + original_entity->identifier.load()->kind == Ast_Ident) { + original_entity->identifier.load()->Ident.entity = new_entity; } // IMPORTANT NOTE(bill, 2021-04-10): copy only the variants |