mirror of
https://github.com/Ed94/Odin.git
synced 2026-07-30 11:20:08 +00:00
Fix case: bug with by-ref unions
This commit is contained in:
@@ -508,7 +508,7 @@ gb_internal lbValue lb_dynamic_map_reserve(lbProcedure *p, lbValue const &map_pt
|
|||||||
gb_internal lbValue lb_find_procedure_value_from_entity(lbModule *m, Entity *e);
|
gb_internal lbValue lb_find_procedure_value_from_entity(lbModule *m, Entity *e);
|
||||||
gb_internal lbValue lb_find_value_from_entity(lbModule *m, Entity *e);
|
gb_internal lbValue lb_find_value_from_entity(lbModule *m, Entity *e);
|
||||||
|
|
||||||
gb_internal void lb_store_type_case_implicit(lbProcedure *p, Ast *clause, lbValue value);
|
gb_internal void lb_store_type_case_implicit(lbProcedure *p, Ast *clause, lbValue value, bool is_default_case);
|
||||||
gb_internal lbAddr lb_store_range_stmt_val(lbProcedure *p, Ast *stmt_val, lbValue value);
|
gb_internal lbAddr lb_store_range_stmt_val(lbProcedure *p, Ast *stmt_val, lbValue value);
|
||||||
gb_internal lbValue lb_emit_source_code_location_const(lbProcedure *p, String const &procedure, TokenPos const &pos);
|
gb_internal lbValue lb_emit_source_code_location_const(lbProcedure *p, String const &procedure, TokenPos const &pos);
|
||||||
gb_internal lbValue lb_const_source_code_location_const(lbModule *m, String const &procedure, TokenPos const &pos);
|
gb_internal lbValue lb_const_source_code_location_const(lbModule *m, String const &procedure, TokenPos const &pos);
|
||||||
|
|||||||
@@ -1454,7 +1454,7 @@ gb_internal void lb_build_switch_stmt(lbProcedure *p, AstSwitchStmt *ss, Scope *
|
|||||||
lb_close_scope(p, lbDeferExit_Default, done);
|
lb_close_scope(p, lbDeferExit_Default, done);
|
||||||
}
|
}
|
||||||
|
|
||||||
gb_internal void lb_store_type_case_implicit(lbProcedure *p, Ast *clause, lbValue value) {
|
gb_internal void lb_store_type_case_implicit(lbProcedure *p, Ast *clause, lbValue value, bool is_default_case) {
|
||||||
Entity *e = implicit_entity_of_node(clause);
|
Entity *e = implicit_entity_of_node(clause);
|
||||||
GB_ASSERT(e != nullptr);
|
GB_ASSERT(e != nullptr);
|
||||||
if (e->flags & EntityFlag_Value) {
|
if (e->flags & EntityFlag_Value) {
|
||||||
@@ -1463,8 +1463,9 @@ gb_internal void lb_store_type_case_implicit(lbProcedure *p, Ast *clause, lbValu
|
|||||||
lbAddr x = lb_add_local(p, e->type, e, false);
|
lbAddr x = lb_add_local(p, e->type, e, false);
|
||||||
lb_addr_store(p, x, value);
|
lb_addr_store(p, x, value);
|
||||||
} else {
|
} else {
|
||||||
// by reference
|
if (!is_default_case) {
|
||||||
GB_ASSERT(are_types_identical(e->type, type_deref(value.type)));
|
GB_ASSERT_MSG(are_types_identical(e->type, type_deref(value.type)), "%s %s", type_to_string(e->type), type_to_string(value.type));
|
||||||
|
}
|
||||||
lb_add_entity(p->module, e, value);
|
lb_add_entity(p->module, e, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1622,7 +1623,7 @@ gb_internal void lb_build_type_switch_stmt(lbProcedure *p, AstTypeSwitchStmt *ss
|
|||||||
lb_open_scope(p, cc->scope);
|
lb_open_scope(p, cc->scope);
|
||||||
if (cc->list.count == 0) {
|
if (cc->list.count == 0) {
|
||||||
lb_start_block(p, default_block);
|
lb_start_block(p, default_block);
|
||||||
lb_store_type_case_implicit(p, clause, parent_value);
|
lb_store_type_case_implicit(p, clause, parent_value, true);
|
||||||
lb_type_case_body(p, ss->label, clause, p->curr_block, done);
|
lb_type_case_body(p, ss->label, clause, p->curr_block, done);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -1688,7 +1689,7 @@ gb_internal void lb_build_type_switch_stmt(lbProcedure *p, AstTypeSwitchStmt *ss
|
|||||||
lb_add_entity(p->module, case_entity, ptr);
|
lb_add_entity(p->module, case_entity, ptr);
|
||||||
lb_add_debug_local_variable(p, ptr.value, case_entity->type, case_entity->token);
|
lb_add_debug_local_variable(p, ptr.value, case_entity->type, case_entity->token);
|
||||||
} else {
|
} else {
|
||||||
lb_store_type_case_implicit(p, clause, parent_value);
|
lb_store_type_case_implicit(p, clause, parent_value, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
lb_type_case_body(p, ss->label, clause, body, done);
|
lb_type_case_body(p, ss->label, clause, body, done);
|
||||||
|
|||||||
Reference in New Issue
Block a user