authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-01-15 18:41:19-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-01-15 18:41:19-07:00
log86f55bce536b6ed678497890f5bd0eed76ebfbb3
tree184f6fd29f016b2a194388d3fa2d7d5d8ce7ed24
parent0311b35a21e9896772cb982750be680b0ef71f1f

add void arrays test


3 files changed, 37 insertions(+), 7 deletions(-)

src/codegen.cpp+17-6
......@@ -514,7 +514,7 @@ static LLVMValueRef gen_array_base_ptr(CodeGen *g, AstNode *node) {
514514 array_ptr = gen_expr(g, node);
515515 }
516516
517 assert(LLVMGetTypeKind(LLVMTypeOf(array_ptr)) == LLVMPointerTypeKind);
517 assert(!array_ptr || LLVMGetTypeKind(LLVMTypeOf(array_ptr)) == LLVMPointerTypeKind);
518518
519519 return array_ptr;
520520}
......@@ -530,6 +530,10 @@ static LLVMValueRef gen_array_ptr(CodeGen *g, AstNode *node) {
530530 LLVMValueRef subscript_value = gen_expr(g, node->data.array_access_expr.subscript);
531531 assert(subscript_value);
532532
533 if (type_entry->size_in_bits == 0) {
534 return nullptr;
535 }
536
533537 if (type_entry->id == TypeTableEntryIdArray) {
534538 LLVMValueRef indices[] = {
535539 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
670674
671675 LLVMValueRef ptr = gen_array_ptr(g, node);
672676
673 if (is_lvalue) {
677 if (is_lvalue || !ptr) {
674678 return ptr;
675679 } else {
676680 add_debug_source_node(g, node);
......@@ -1189,6 +1193,10 @@ static LLVMValueRef gen_assign_expr(CodeGen *g, AstNode *node) {
11891193
11901194 LLVMValueRef value = gen_expr(g, node->data.bin_op_expr.op2);
11911195
1196 if (op1_type->size_in_bits == 0) {
1197 return nullptr;
1198 }
1199
11921200 return gen_assign_raw(g, node, node->data.bin_op_expr.bin_op, target_ref, value, op1_type, op2_type);
11931201}
11941202
......@@ -1723,7 +1731,7 @@ static LLVMValueRef gen_var_decl_raw(CodeGen *g, AstNode *source_node, AstNodeVa
17231731 if (var_decl->expr) {
17241732 *init_value = gen_expr(g, var_decl->expr);
17251733 }
1726 if (variable->type->id == TypeTableEntryIdVoid) {
1734 if (variable->type->size_in_bits == 0) {
17271735 return nullptr;
17281736 } else {
17291737 if (var_decl->expr) {
......@@ -1788,7 +1796,7 @@ static LLVMValueRef gen_symbol(CodeGen *g, AstNode *node) {
17881796 get_resolved_expr(node)->block_context,
17891797 &node->data.symbol_expr.symbol);
17901798 assert(variable);
1791 if (variable->type->id == TypeTableEntryIdVoid) {
1799 if (variable->type->size_in_bits == 0) {
17921800 return nullptr;
17931801 } else if (variable->is_ptr) {
17941802 assert(variable->value_ref);
......@@ -2122,8 +2130,9 @@ static void do_code_gen(CodeGen *g) {
21222130 break;
21232131
21242132 VariableTableEntry *var = entry->value;
2125 if (var->type->id == TypeTableEntryIdVoid)
2133 if (var->type->size_in_bits == 0) {
21262134 continue;
2135 }
21272136
21282137 unsigned tag;
21292138 unsigned arg_no;
......@@ -2732,7 +2741,9 @@ void codegen_add_root_code(CodeGen *g, Buf *src_dir, Buf *src_basename, Buf *sou
27322741 g->bootstrap_import = add_special_code(g, "bootstrap.zig");
27332742 }
27342743
2735 add_special_code(g, "builtin.zig");
2744 if (g->out_type == OutTypeExe) {
2745 add_special_code(g, "builtin.zig");
2746 }
27362747 }
27372748
27382749 if (g->verbose) {
std/rand.zig+1-1
......@@ -59,7 +59,7 @@ pub struct Rand {
5959
6060 while (true) {
6161 r.get_bytes_aligned(rand_val_array);
62 const rand_val = *((&u64)(rand_val_array.ptr));
62 const rand_val = *(&u64)(rand_val_array.ptr);
6363 if (rand_val < upper_bound) {
6464 return start + (rand_val % range);
6565 }
test/run_tests.cpp+19
......@@ -351,6 +351,25 @@ pub fn main(argc: isize, argv: &&u8, env: &&u8) i32 => {
351351
352352 )SOURCE", "OK\n");
353353
354 add_simple_case("void arrays", R"SOURCE(
355use "std.zig";
356
357pub fn main(argc: isize, argv: &&u8, env: &&u8) i32 => {
358 var array: [4]void;
359 array[0] = void{};
360 array[1] = array[2];
361 if (@sizeof(@typeof(array)) != 0) {
362 print_str("BAD\n");
363 }
364 if (array.len != 4) {
365 print_str("BAD\n");
366 }
367 print_str("OK\n");
368 return 0;
369}
370 )SOURCE", "OK\n");
371
372
354373 add_simple_case("mutable local variables", R"SOURCE(
355374use "std.zig";
356375