From c2809c2948cecffc128472ed6a0abe9bfd0c3a26 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 2 Sep 2022 16:23:16 +0100 Subject: Improve basic escape analysis --- src/check_stmt.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) (limited to 'src/check_stmt.cpp') 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) { -- cgit v1.2.3