Commit 86f55bce53

Andrew Kelley <superjoe30@gmail.com>
2016-01-16 02:41:19
add void arrays test
1 parent 0311b35
Changed files (3)
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) {
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);
             }
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";