diff options
| author | gingerBill <bill@gingerbill.org> | 2022-09-02 16:23:16 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2022-09-02 16:23:16 +0100 |
| commit | c2809c2948cecffc128472ed6a0abe9bfd0c3a26 (patch) | |
| tree | 06d094413693231b6e0559b688d7e6c4b51c226a /src/check_stmt.cpp | |
| parent | 99e5a14703d9c2a666a2381608ecdfee2cc6ea45 (diff) | |
Improve basic escape analysis
Diffstat (limited to 'src/check_stmt.cpp')
| -rw-r--r-- | src/check_stmt.cpp | 11 |
1 files changed, 4 insertions, 7 deletions
diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index d741ceabf..9e4504dc1 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -1400,7 +1400,7 @@ bool check_expr_is_stack_variable(Ast *expr) { expr = unparen_expr(expr); Entity *e = entity_of_node(expr); if (e && e->kind == Entity_Variable) { - if (e->flags & (EntityFlag_Static|EntityFlag_Using)) { + if (e->flags & (EntityFlag_Static|EntityFlag_Using|EntityFlag_ImplicitReference|EntityFlag_ForValue)) { // okay } else if (e->Variable.thread_local_model.len != 0) { // okay @@ -1941,13 +1941,10 @@ void check_stmt_internal(CheckerContext *ctx, Ast *node, u32 flags) { } if (found == nullptr) { entity = alloc_entity_variable(ctx->scope, token, type, EntityState_Resolved); + entity->flags |= EntityFlag_ForValue; entity->flags |= EntityFlag_Value; - if (i == addressable_index) { - if (use_by_reference_for_value) { - entity->flags &= ~EntityFlag_Value; - } else { - entity->flags |= EntityFlag_ForValue; - } + if (i == addressable_index && use_by_reference_for_value) { + entity->flags &= ~EntityFlag_Value; } if (is_soa) { if (i == 0) { |