diff options
| author | gingerBill <bill@gingerbill.org> | 2023-06-21 14:07:14 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2023-06-21 14:07:14 +0100 |
| commit | c9fb078c0f1e09edcc023dce30dd0ca04f20cc24 (patch) | |
| tree | 32908fb69e844e7f735fe9fd4ace3ca4ec9a68bf /src/llvm_backend_proc.cpp | |
| parent | 180003035659d56a898ddf7de59e8630493c2147 (diff) | |
Handle `#c_vararg`
Diffstat (limited to 'src/llvm_backend_proc.cpp')
| -rw-r--r-- | src/llvm_backend_proc.cpp | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 48b4b9330..7cf82b208 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -3265,17 +3265,16 @@ gb_internal lbValue lb_build_call_expr_internal(lbProcedure *p, Ast *expr) { GB_ASSERT(slice_type->kind == Type_Slice); if (is_c_vararg) { - GB_PANIC("TODO #c_vararg"); GB_ASSERT(!vari_expand); Type *elem_type = slice_type->Slice.elem; for (Ast *var_arg : variadic) { lbValue arg = lb_build_expr(p, var_arg); - if (!is_type_any(elem_type)) { - array_add(&args, lb_emit_conv(p, arg, elem_type)); - } else { + if (is_type_any(elem_type)) { array_add(&args, lb_emit_conv(p, arg, default_type(arg.type))); + } else { + array_add(&args, lb_emit_conv(p, arg, elem_type)); } } break; @@ -3321,7 +3320,9 @@ gb_internal lbValue lb_build_call_expr_internal(lbProcedure *p, Ast *expr) { } } - array_resize(&args, pt->param_count); + if (!is_c_vararg) { + array_resize(&args, pt->param_count); + } for (Ast *arg : ce->split_args->named) { ast_node(fv, FieldValue, arg); @@ -3343,6 +3344,9 @@ gb_internal lbValue lb_build_call_expr_internal(lbProcedure *p, Ast *expr) { GB_ASSERT(args.count >= pt->params->Tuple.variables.count); for_array(arg_index, pt->params->Tuple.variables) { Entity *e = pt->params->Tuple.variables[arg_index]; + if (pt->variadic && arg_index == pt->variadic_index) { + continue; + } lbValue arg = args[arg_index]; if (arg.value == nullptr) { @@ -3366,7 +3370,6 @@ gb_internal lbValue lb_build_call_expr_internal(lbProcedure *p, Ast *expr) { } } - isize final_count = is_c_vararg ? args.count : pt->param_count; auto call_args = array_slice(args, 0, final_count); return lb_emit_call(p, value, call_args, ce->inlining); |