aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/codegen.cpp')
-rw-r--r--src/codegen.cpp47
1 files changed, 17 insertions, 30 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp
index d95b0c394d..cfae4da2a1 100644
--- a/src/codegen.cpp
+++ b/src/codegen.cpp
@@ -544,41 +544,28 @@ static LLVMValueRef gen_fn_call_expr(CodeGen *g, AstNode *node) {
return gen_cast_expr(g, node);
}
- FnTableEntry *fn_table_entry = node->data.fn_call_expr.fn_entry;
AstNode *fn_ref_expr = node->data.fn_call_expr.fn_ref_expr;
+ if (node->data.fn_call_expr.enum_type) {
+ int param_count = node->data.fn_call_expr.params.length;
+ AstNode *arg1_node;
+ if (param_count == 1) {
+ arg1_node = node->data.fn_call_expr.params.at(0);
+ } else {
+ assert(param_count == 0);
+ arg1_node = nullptr;
+ }
+ return gen_enum_value_expr(g, fn_ref_expr, node->data.fn_call_expr.enum_type, arg1_node);
+ }
+
+ FnTableEntry *fn_table_entry = node->data.fn_call_expr.fn_entry;
TypeTableEntry *struct_type = nullptr;
AstNode *first_param_expr = nullptr;
- if (fn_ref_expr->type == NodeTypeFieldAccessExpr) {
+
+ if (fn_ref_expr->type == NodeTypeFieldAccessExpr &&
+ fn_ref_expr->data.field_access_expr.is_member_fn)
+ {
first_param_expr = fn_ref_expr->data.field_access_expr.struct_expr;
struct_type = get_expr_type(first_param_expr);
- if (struct_type->id == TypeTableEntryIdStruct) {
- fn_table_entry = node->data.fn_call_expr.fn_entry;
- } else if (struct_type->id == TypeTableEntryIdPointer) {
- assert(struct_type->data.pointer.child_type->id == TypeTableEntryIdStruct);
- fn_table_entry = node->data.fn_call_expr.fn_entry;
- } else if (struct_type->id == TypeTableEntryIdMetaType) {
- TypeTableEntry *child_type = get_type_for_type_node(first_param_expr);
-
- if (child_type->id == TypeTableEntryIdEnum) {
- int param_count = node->data.fn_call_expr.params.length;
- AstNode *arg1_node;
- if (param_count == 1) {
- arg1_node = node->data.fn_call_expr.params.at(0);
- } else {
- assert(param_count == 0);
- arg1_node = nullptr;
- }
- return gen_enum_value_expr(g, fn_ref_expr, child_type, arg1_node);
- } else if (child_type->id == TypeTableEntryIdStruct) {
- struct_type = nullptr;
- first_param_expr = nullptr;
- fn_table_entry = node->data.fn_call_expr.fn_entry;
- } else {
- zig_unreachable();
- }
- } else {
- zig_unreachable();
- }
}
TypeTableEntry *fn_type;