diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/llvm_backend_const.cpp | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp index 9b785c4b4..22e124792 100644 --- a/src/llvm_backend_const.cpp +++ b/src/llvm_backend_const.cpp @@ -802,13 +802,21 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb if (value.kind == ExactValue_Procedure) { lbValue res = {}; - Ast *expr = unparen_expr(value.value_procedure); - GB_ASSERT(expr != nullptr); - if (expr->kind == Ast_ProcLit) { - res = lb_generate_anonymous_proc_lit(m, str_lit("_proclit"), expr); - } else { + for (;;) { + Ast *expr = unparen_expr(value.value_procedure); + GB_ASSERT(expr != nullptr); + if (expr->kind == Ast_ProcLit) { + res = lb_generate_anonymous_proc_lit(m, str_lit("_proclit"), expr); + break; + } Entity *e = entity_from_expr(expr); - res = lb_find_procedure_value_from_entity(m, e); + GB_ASSERT(e != nullptr); + if (e->kind != Entity_Constant) { + res = lb_find_procedure_value_from_entity(m, e); + break; + } + value = e->Constant.value; + GB_ASSERT(value.kind == ExactValue_Procedure); } if (res.value == nullptr) { // This is an unspecialized polymorphic procedure, return nil or dummy value |