| ... | @@ -398,7 +398,9 @@ static LLVMValueRef gen_cast_expr(CodeGen *g, AstNode *node) { | ... | @@ -398,7 +398,9 @@ static LLVMValueRef gen_cast_expr(CodeGen *g, AstNode *node) { |
| 398 | | 398 | |
| 399 | TypeTableEntry *child_type = wanted_type->data.maybe.child_type; | 399 | TypeTableEntry *child_type = wanted_type->data.maybe.child_type; |
| 400 | | 400 | |
| 401 | if (child_type->id == TypeTableEntryIdPointer) { | 401 | if (child_type->id == TypeTableEntryIdPointer || |
| | 402 | child_type->id == TypeTableEntryIdFn) |
| | 403 | { |
| 402 | return expr_val; | 404 | return expr_val; |
| 403 | } else { | 405 | } else { |
| 404 | add_debug_source_node(g, node); | 406 | add_debug_source_node(g, node); |
| ... | @@ -1274,7 +1276,9 @@ static LLVMValueRef gen_unwrap_maybe(CodeGen *g, AstNode *node, LLVMValueRef may | ... | @@ -1274,7 +1276,9 @@ static LLVMValueRef gen_unwrap_maybe(CodeGen *g, AstNode *node, LLVMValueRef may |
| 1274 | TypeTableEntry *type_entry = get_expr_type(node); | 1276 | TypeTableEntry *type_entry = get_expr_type(node); |
| 1275 | assert(type_entry->id == TypeTableEntryIdMaybe); | 1277 | assert(type_entry->id == TypeTableEntryIdMaybe); |
| 1276 | TypeTableEntry *child_type = type_entry->data.maybe.child_type; | 1278 | TypeTableEntry *child_type = type_entry->data.maybe.child_type; |
| 1277 | if (child_type->id == TypeTableEntryIdPointer) { | 1279 | if (child_type->id == TypeTableEntryIdPointer || |
| | 1280 | child_type->id == TypeTableEntryIdFn) |
| | 1281 | { |
| 1278 | return maybe_struct_ref; | 1282 | return maybe_struct_ref; |
| 1279 | } else { | 1283 | } else { |
| 1280 | add_debug_source_node(g, node); | 1284 | add_debug_source_node(g, node); |
| ... | @@ -1301,7 +1305,9 @@ static LLVMValueRef gen_unwrap_maybe_expr(CodeGen *g, AstNode *node) { | ... | @@ -1301,7 +1305,9 @@ static LLVMValueRef gen_unwrap_maybe_expr(CodeGen *g, AstNode *node) { |
| 1301 | TypeTableEntry *child_type = maybe_type->data.maybe.child_type; | 1305 | TypeTableEntry *child_type = maybe_type->data.maybe.child_type; |
| 1302 | | 1306 | |
| 1303 | LLVMValueRef cond_value; | 1307 | LLVMValueRef cond_value; |
| 1304 | if (child_type->id == TypeTableEntryIdPointer) { | 1308 | if (child_type->id == TypeTableEntryIdPointer || |
| | 1309 | child_type->id == TypeTableEntryIdFn) |
| | 1310 | { |
| 1305 | cond_value = LLVMBuildICmp(g->builder, LLVMIntNE, maybe_struct_ref, | 1311 | cond_value = LLVMBuildICmp(g->builder, LLVMIntNE, maybe_struct_ref, |
| 1306 | LLVMConstNull(child_type->type_ref), ""); | 1312 | LLVMConstNull(child_type->type_ref), ""); |
| 1307 | } else { | 1313 | } else { |
| ... | @@ -1651,7 +1657,9 @@ static LLVMValueRef gen_if_var_expr(CodeGen *g, AstNode *node) { | ... | @@ -1651,7 +1657,9 @@ static LLVMValueRef gen_if_var_expr(CodeGen *g, AstNode *node) { |
| 1651 | assert(expr_type->id == TypeTableEntryIdMaybe); | 1657 | assert(expr_type->id == TypeTableEntryIdMaybe); |
| 1652 | TypeTableEntry *child_type = expr_type->data.maybe.child_type; | 1658 | TypeTableEntry *child_type = expr_type->data.maybe.child_type; |
| 1653 | LLVMValueRef cond_value; | 1659 | LLVMValueRef cond_value; |
| 1654 | if (child_type->id == TypeTableEntryIdPointer) { | 1660 | if (child_type->id == TypeTableEntryIdPointer || |
| | 1661 | child_type->id == TypeTableEntryIdFn) |
| | 1662 | { |
| 1655 | cond_value = LLVMBuildICmp(g->builder, LLVMIntNE, init_val, LLVMConstNull(child_type->type_ref), ""); | 1663 | cond_value = LLVMBuildICmp(g->builder, LLVMIntNE, init_val, LLVMConstNull(child_type->type_ref), ""); |
| 1656 | } else { | 1664 | } else { |
| 1657 | add_debug_source_node(g, node); | 1665 | add_debug_source_node(g, node); |
| ... | @@ -2377,7 +2385,9 @@ static LLVMValueRef gen_const_val(CodeGen *g, TypeTableEntry *type_entry, ConstE | ... | @@ -2377,7 +2385,9 @@ static LLVMValueRef gen_const_val(CodeGen *g, TypeTableEntry *type_entry, ConstE |
| 2377 | case TypeTableEntryIdMaybe: | 2385 | case TypeTableEntryIdMaybe: |
| 2378 | { | 2386 | { |
| 2379 | TypeTableEntry *child_type = type_entry->data.maybe.child_type; | 2387 | TypeTableEntry *child_type = type_entry->data.maybe.child_type; |
| 2380 | if (child_type->id == TypeTableEntryIdPointer) { | 2388 | if (child_type->id == TypeTableEntryIdPointer || |
| | 2389 | child_type->id == TypeTableEntryIdFn) |
| | 2390 | { |
| 2381 | if (const_val->data.x_maybe) { | 2391 | if (const_val->data.x_maybe) { |
| 2382 | return gen_const_val(g, child_type, const_val->data.x_maybe); | 2392 | return gen_const_val(g, child_type, const_val->data.x_maybe); |
| 2383 | } else { | 2393 | } else { |