Browse Source

Improve basic escape analysis

gingerBill 3 years ago
parent
commit
c2809c2948
1 changed files with 4 additions and 7 deletions
  1. 4 7
      src/check_stmt.cpp

+ 4 - 7
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) {