Commit 9d16839420

Andrew Kelley <andrew@ziglang.org>
2019-05-28 22:11:09
fix invalid LLVM IR generated for ?*void const casts
closes #2578
1 parent 508fdfe
Changed files (3)
src
test
stage1
behavior
src/codegen.cpp
@@ -2002,7 +2002,7 @@ static LLVMValueRef ir_llvm_value(CodeGen *g, IrInstruction *instruction) {
             render_const_val_global(g, &instruction->value, "");
             ZigType *ptr_type = get_pointer_to_type(g, instruction->value.type, true);
             instruction->llvm_value = LLVMBuildBitCast(g->builder, instruction->value.global_refs->llvm_global, get_llvm_type(g, ptr_type), "");
-        } else if (instruction->value.type->id == ZigTypeIdPointer) {
+        } else if (get_codegen_ptr_type(instruction->value.type) != nullptr) {
             instruction->llvm_value = LLVMBuildBitCast(g->builder, instruction->value.global_refs->llvm_value,
                     get_llvm_type(g, instruction->value.type), "");
         } else {
test/stage1/behavior/bugs/2578.zig
@@ -0,0 +1,12 @@
+const Foo = struct {
+    y: u8,
+};
+
+var foo: Foo = undefined;
+const t = &foo;
+
+fn bar(pointer: ?*c_void) void {}
+
+test "fixed" {
+    bar(t);
+}
test/stage1/behavior.zig
@@ -26,6 +26,7 @@ comptime {
     _ = @import("behavior/bugs/2006.zig");
     _ = @import("behavior/bugs/2114.zig");
     _ = @import("behavior/bugs/2346.zig");
+    _ = @import("behavior/bugs/2578.zig");
     _ = @import("behavior/bugs/394.zig");
     _ = @import("behavior/bugs/421.zig");
     _ = @import("behavior/bugs/529.zig");