diff options
| author | gingerBill <bill@gingerbill.org> | 2022-09-08 17:27:13 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2022-09-08 17:27:13 +0100 |
| commit | 3fae8b49db54e2be6a61453cf3f5bbd452c58662 (patch) | |
| tree | 6b4774e7f01b5d8af5653d57988b2aac8a00fb12 /src | |
| parent | 8fb9db3deb931e46404a0c832fd914feb94e211f (diff) | |
Fix pointer cast of constant procedure values
Diffstat (limited to 'src')
| -rw-r--r-- | src/llvm_backend_const.cpp | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp index 5826dbaec..6a3b14471 100644 --- a/src/llvm_backend_const.cpp +++ b/src/llvm_backend_const.cpp @@ -381,12 +381,17 @@ lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, bool allow_loc } if (value.kind == ExactValue_Procedure) { + lbValue res = {}; Ast *expr = unparen_expr(value.value_procedure); if (expr->kind == Ast_ProcLit) { - return lb_generate_anonymous_proc_lit(m, str_lit("_proclit"), expr); + res = lb_generate_anonymous_proc_lit(m, str_lit("_proclit"), expr); + + } else { + Entity *e = entity_from_expr(expr); + res = lb_find_procedure_value_from_entity(m, e); } - Entity *e = entity_from_expr(expr); - return lb_find_procedure_value_from_entity(m, e); + res.value = LLVMConstPointerCast(res.value, lb_type(m, res.type)); + return res; } bool is_local = allow_local && m->curr_procedure != nullptr; @@ -1141,13 +1146,7 @@ lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, bool allow_loc } break; case ExactValue_Procedure: - { - Ast *expr = value.value_procedure; - GB_ASSERT(expr != nullptr); - if (expr->kind == Ast_ProcLit) { - return lb_generate_anonymous_proc_lit(m, str_lit("_proclit"), expr); - } - } + GB_PANIC("handled earlier"); break; case ExactValue_Typeid: return lb_typeid(m, value.value_typeid); |