From 86f55bce536b6ed678497890f5bd0eed76ebfbb3 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Fri, 15 Jan 2016 18:41:19 -0700 Subject: [PATCH] add void arrays test --- src/codegen.cpp | 23 +++++++++++++++++------ std/rand.zig | 2 +- test/run_tests.cpp | 19 +++++++++++++++++++ 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/codegen.cpp b/src/codegen.cpp index cc6219d6f0..d9d22d52ac 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -514,7 +514,7 @@ static LLVMValueRef gen_array_base_ptr(CodeGen *g, AstNode *node) { array_ptr = gen_expr(g, node); } - assert(LLVMGetTypeKind(LLVMTypeOf(array_ptr)) == LLVMPointerTypeKind); + assert(!array_ptr || LLVMGetTypeKind(LLVMTypeOf(array_ptr)) == LLVMPointerTypeKind); return array_ptr; } @@ -530,6 +530,10 @@ static LLVMValueRef gen_array_ptr(CodeGen *g, AstNode *node) { LLVMValueRef subscript_value = gen_expr(g, node->data.array_access_expr.subscript); assert(subscript_value); + if (type_entry->size_in_bits == 0) { + return nullptr; + } + if (type_entry->id == TypeTableEntryIdArray) { LLVMValueRef indices[] = { LLVMConstNull(g->builtin_types.entry_usize->type_ref), @@ -670,7 +674,7 @@ static LLVMValueRef gen_array_access_expr(CodeGen *g, AstNode *node, bool is_lva LLVMValueRef ptr = gen_array_ptr(g, node); - if (is_lvalue) { + if (is_lvalue || !ptr) { return ptr; } else { add_debug_source_node(g, node); @@ -1189,6 +1193,10 @@ static LLVMValueRef gen_assign_expr(CodeGen *g, AstNode *node) { LLVMValueRef value = gen_expr(g, node->data.bin_op_expr.op2); + if (op1_type->size_in_bits == 0) { + return nullptr; + } + return gen_assign_raw(g, node, node->data.bin_op_expr.bin_op, target_ref, value, op1_type, op2_type); } @@ -1723,7 +1731,7 @@ static LLVMValueRef gen_var_decl_raw(CodeGen *g, AstNode *source_node, AstNodeVa if (var_decl->expr) { *init_value = gen_expr(g, var_decl->expr); } - if (variable->type->id == TypeTableEntryIdVoid) { + if (variable->type->size_in_bits == 0) { return nullptr; } else { if (var_decl->expr) { @@ -1788,7 +1796,7 @@ static LLVMValueRef gen_symbol(CodeGen *g, AstNode *node) { get_resolved_expr(node)->block_context, &node->data.symbol_expr.symbol); assert(variable); - if (variable->type->id == TypeTableEntryIdVoid) { + if (variable->type->size_in_bits == 0) { return nullptr; } else if (variable->is_ptr) { assert(variable->value_ref); @@ -2122,8 +2130,9 @@ static void do_code_gen(CodeGen *g) { break; VariableTableEntry *var = entry->value; - if (var->type->id == TypeTableEntryIdVoid) + if (var->type->size_in_bits == 0) { continue; + } unsigned tag; unsigned arg_no; @@ -2732,7 +2741,9 @@ void codegen_add_root_code(CodeGen *g, Buf *src_dir, Buf *src_basename, Buf *sou g->bootstrap_import = add_special_code(g, "bootstrap.zig"); } - add_special_code(g, "builtin.zig"); + if (g->out_type == OutTypeExe) { + add_special_code(g, "builtin.zig"); + } } if (g->verbose) { diff --git a/std/rand.zig b/std/rand.zig index 7dab688d29..642dc0960b 100644 --- a/std/rand.zig +++ b/std/rand.zig @@ -59,7 +59,7 @@ pub struct Rand { while (true) { r.get_bytes_aligned(rand_val_array); - const rand_val = *((&u64)(rand_val_array.ptr)); + const rand_val = *(&u64)(rand_val_array.ptr); if (rand_val < upper_bound) { return start + (rand_val % range); } diff --git a/test/run_tests.cpp b/test/run_tests.cpp index 2f9fedd6b0..8d85f7782c 100644 --- a/test/run_tests.cpp +++ b/test/run_tests.cpp @@ -351,6 +351,25 @@ pub fn main(argc: isize, argv: &&u8, env: &&u8) i32 => { )SOURCE", "OK\n"); + add_simple_case("void arrays", R"SOURCE( +use "std.zig"; + +pub fn main(argc: isize, argv: &&u8, env: &&u8) i32 => { + var array: [4]void; + array[0] = void{}; + array[1] = array[2]; + if (@sizeof(@typeof(array)) != 0) { + print_str("BAD\n"); + } + if (array.len != 4) { + print_str("BAD\n"); + } + print_str("OK\n"); + return 0; +} + )SOURCE", "OK\n"); + + add_simple_case("mutable local variables", R"SOURCE( use "std.zig";