authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-04-06 21:00:49-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-04-06 21:00:49-04:00
loga3de550d3bf020fd68e1331d3cb8b7b422894f96
treef6d5a2a173bc3dd6c42fc0581cc1ec9d06fa3cea
parent273cebdf4dde46f00eb177b9aa05d8dd1c0606a7

fix var args having wrong index when runtime param before it

closes #312

2 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,7 +8346,7 @@ static TypeTableEntry *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCall *cal
8346 }8346 }
83478347
8348 bool found_first_var_arg = false;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;
83508350
8351 FnTableEntry *parent_fn_entry = exec_fn_entry(ira->new_irb.exec);8351 FnTableEntry *parent_fn_entry = exec_fn_entry(ira->new_irb.exec);
8352 assert(parent_fn_entry);8352 assert(parent_fn_entry);
...@@ -8394,6 +8394,10 @@ static TypeTableEntry *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCall *cal...@@ -8394,6 +8394,10 @@ static TypeTableEntry *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCall *cal
8394 AstNode *param_decl_node = fn_proto_node->data.fn_proto.params.at(next_proto_i);8394 AstNode *param_decl_node = fn_proto_node->data.fn_proto.params.at(next_proto_i);
8395 Buf *param_name = param_decl_node->data.param_decl.name;8395 Buf *param_name = param_decl_node->data.param_decl.name;
83968396
8397 if (!found_first_var_arg) {
8398 first_var_arg = inst_fn_type_id.param_count;
8399 }
8400
8397 ConstExprValue *var_args_val = create_const_arg_tuple(ira->codegen,8401 ConstExprValue *var_args_val = create_const_arg_tuple(ira->codegen,
8398 first_var_arg, inst_fn_type_id.param_count);8402 first_var_arg, inst_fn_type_id.param_count);
8399 VariableTableEntry *var = add_variable(ira->codegen, param_decl_node,8403 VariableTableEntry *var = add_variable(ira->codegen, param_decl_node,
test/cases/var_args.zig+22
...@@ -31,3 +31,25 @@ test "testPassArgsDirectly" {...@@ -31,3 +31,25 @@ test "testPassArgsDirectly" {
31fn addSomeStuff(args: ...) -> i32 {31fn addSomeStuff(args: ...) -> i32 {
32 return add(args);32 return add(args);
33}33}
34
35test "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
47fn 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}