| author | |
| committer | |
| log | a3de550d3bf020fd68e1331d3cb8b7b422894f96 |
| tree | f6d5a2a173bc3dd6c42fc0581cc1ec9d06fa3cea |
| parent | 273cebdf4dde46f00eb177b9aa05d8dd1c0606a7 |
closes #3122 files changed, 27 insertions(+), 1 deletions(-)
src/ir.cpp+5-1| ... | ... | @@ -8346,7 +8346,7 @@ static TypeTableEntry *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCall *cal |
| 8346 | 8346 | } |
| 8347 | 8347 | |
| 8348 | 8348 | bool found_first_var_arg = false; |
| 8349 | size_t first_var_arg = inst_fn_type_id.param_count; | |
| 8349 | size_t first_var_arg; | |
| 8350 | 8350 | |
| 8351 | 8351 | FnTableEntry *parent_fn_entry = exec_fn_entry(ira->new_irb.exec); |
| 8352 | 8352 | assert(parent_fn_entry); |
| ... | ... | @@ -8394,6 +8394,10 @@ static TypeTableEntry *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCall *cal |
| 8394 | 8394 | AstNode *param_decl_node = fn_proto_node->data.fn_proto.params.at(next_proto_i); |
| 8395 | 8395 | Buf *param_name = param_decl_node->data.param_decl.name; |
| 8396 | 8396 | |
| 8397 | if (!found_first_var_arg) { | |
| 8398 | first_var_arg = inst_fn_type_id.param_count; | |
| 8399 | } | |
| 8400 | ||
| 8397 | 8401 | ConstExprValue *var_args_val = create_const_arg_tuple(ira->codegen, |
| 8398 | 8402 | first_var_arg, inst_fn_type_id.param_count); |
| 8399 | 8403 | VariableTableEntry *var = add_variable(ira->codegen, param_decl_node, |
test/cases/var_args.zig+22| ... | ... | @@ -31,3 +31,25 @@ test "testPassArgsDirectly" { |
| 31 | 31 | fn addSomeStuff(args: ...) -> i32 { |
| 32 | 32 | return add(args); |
| 33 | 33 | } |
| 34 | ||
| 35 | test "runtime parameter before var args" { | |
| 36 | assert(extraFn(10) == 0); | |
| 37 | assert(extraFn(10, false) == 1); | |
| 38 | assert(extraFn(10, false, true) == 2); | |
| 39 | ||
| 40 | //comptime { | |
| 41 | // assert(extraFn(10) == 0); | |
| 42 | // assert(extraFn(10, false) == 1); | |
| 43 | // assert(extraFn(10, false, true) == 2); | |
| 44 | //} | |
| 45 | } | |
| 46 | ||
| 47 | fn extraFn(extra: u32, args: ...) -> usize { | |
| 48 | if (args.len >= 1) { | |
| 49 | assert(args[0] == false); | |
| 50 | } | |
| 51 | if (args.len >= 2) { | |
| 52 | assert(args[1] == true); | |
| 53 | } | |
| 54 | return args.len; | |
| 55 | } |