diff --git a/example/guess_number/main.zig b/example/guess_number/main.zig index 78a8c63a23..f770704dab 100644 --- a/example/guess_number/main.zig +++ b/example/guess_number/main.zig @@ -18,8 +18,7 @@ pub fn main(args: [][]u8) %void => { return error.GetRandomFail; } - var rand : Rand; - rand.init(seed); + var rand = rand_new(seed); const answer = rand.range_u64(0, 100) + 1; diff --git a/src/analyze.cpp b/src/analyze.cpp index 28bce3d52b..9e0d315c0a 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -3955,7 +3955,6 @@ static void analyze_top_level_fn_def(CodeGen *g, ImportTableEntry *import, AstNo AstNodeFnProto *fn_proto = &fn_proto_node->data.fn_proto; bool is_exported = (fn_proto->visib_mod == VisibModExport); - int gen_arg_index = 0; for (int i = 0; i < fn_proto->params.length; i += 1) { AstNode *param_decl_node = fn_proto->params.at(i); assert(param_decl_node->type == NodeTypeParamDecl); @@ -3978,12 +3977,7 @@ static void analyze_top_level_fn_def(CodeGen *g, ImportTableEntry *import, AstNo var->src_arg_index = i; param_decl_node->data.param_decl.variable = var; - if (type->size_in_bits > 0) { - var->gen_arg_index = gen_arg_index; - gen_arg_index += 1; - } else { - var->gen_arg_index = -1; - } + var->gen_arg_index = param_decl_node->data.param_decl.gen_index; } TypeTableEntry *expected_type = unwrapped_node_type(fn_proto->return_type); diff --git a/src/codegen.cpp b/src/codegen.cpp index 5ee40c144f..2f2c5c7fff 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -2319,6 +2319,10 @@ static void do_code_gen(CodeGen *g) { if (param_type->id == TypeTableEntryIdPointer && param_type->data.pointer.is_const) { LLVMAddAttribute(argument_val, LLVMReadOnlyAttribute); } + if (param_type->id == TypeTableEntryIdPointer) { + // when https://github.com/andrewrk/zig/issues/82 is fixed, add + // non null attribute here + } if (param_node->data.param_decl.is_byval) { LLVMAddAttribute(argument_val, LLVMByValAttribute); } diff --git a/std/rand.zig b/std/rand.zig index 63380e2dc5..2940d35349 100644 --- a/std/rand.zig +++ b/std/rand.zig @@ -6,20 +6,6 @@ pub struct Rand { array: [ARRAY_SIZE]u32, index: isize, - /// Initialize random state with the given seed. - pub fn init(r: &Rand, seed: u32) => { - r.index = 0; - r.array[0] = seed; - var i : isize = 1; - var prev_value: u64 = seed; - while (i < ARRAY_SIZE) { - r.array[i] = u32((prev_value ^ (prev_value << 30)) * 0x6c078965 + u32(i)); - prev_value = r.array[i]; - i += 1; - } - } - - /// Get 32 bits of randomness. pub fn get_u32(r: &Rand) u32 => { if (r.index == 0) { @@ -91,3 +77,17 @@ pub struct Rand { } } +/// Initialize random state with the given seed. +pub fn rand_new(seed: u32) Rand => { + var r: Rand; + r.index = 0; + r.array[0] = seed; + var i : isize = 1; + var prev_value: u64 = seed; + while (i < ARRAY_SIZE) { + r.array[i] = u32((prev_value ^ (prev_value << 30)) * 0x6c078965 + u32(i)); + prev_value = r.array[i]; + i += 1; + } + return r; +} diff --git a/test/run_tests.cpp b/test/run_tests.cpp index e7b3e57c66..684ec820d7 100644 --- a/test/run_tests.cpp +++ b/test/run_tests.cpp @@ -1242,14 +1242,14 @@ struct Foo { x: i32, y: i32, } -fn make_foo() Foo => { +fn make_foo(x: i32, y: i32) Foo => { Foo { - .x = 1234, - .y = 5678, + .x = x, + .y = y, } } pub fn main(args: [][]u8) %void => { - const foo = make_foo(); + const foo = make_foo(1234, 5678); if (foo.y != 5678) { print_str("BAD\n"); }