aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2019-05-08 16:06:34 -0400
committerAndrew Kelley <andrew@ziglang.org>2019-05-08 16:06:34 -0400
commit50bbb34594eedf7a978c00edb525bcea472b554b (patch)
tree4936a28958fea277de9702b582bd13bc0ddeda83 /src/codegen.cpp
parentbe7cacfbbec8aed234a0316d11a9ae0e8cda0286 (diff)
downloadzig-50bbb34594eedf7a978c00edb525bcea472b554b.tar.gz
zig-50bbb34594eedf7a978c00edb525bcea472b554b.zip
C pointers support `null`
See #1967
Diffstat (limited to 'src/codegen.cpp')
-rw-r--r--src/codegen.cpp22
1 files changed, 11 insertions, 11 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp
index 396dfb1f88..712ee908cb 100644
--- a/src/codegen.cpp
+++ b/src/codegen.cpp
@@ -4023,19 +4023,19 @@ static LLVMValueRef ir_render_asm(CodeGen *g, IrExecutable *executable, IrInstru
}
static LLVMValueRef gen_non_null_bit(CodeGen *g, ZigType *maybe_type, LLVMValueRef maybe_handle) {
- assert(maybe_type->id == ZigTypeIdOptional);
+ assert(maybe_type->id == ZigTypeIdOptional ||
+ (maybe_type->id == ZigTypeIdPointer && maybe_type->data.pointer.allow_zero));
+
ZigType *child_type = maybe_type->data.maybe.child_type;
- if (!type_has_bits(child_type)) {
+ if (!type_has_bits(child_type))
return maybe_handle;
- } else {
- bool is_scalar = !handle_is_ptr(maybe_type);
- if (is_scalar) {
- return LLVMBuildICmp(g->builder, LLVMIntNE, maybe_handle, LLVMConstNull(get_llvm_type(g, maybe_type)), "");
- } else {
- LLVMValueRef maybe_field_ptr = LLVMBuildStructGEP(g->builder, maybe_handle, maybe_null_index, "");
- return gen_load_untyped(g, maybe_field_ptr, 0, false, "");
- }
- }
+
+ bool is_scalar = !handle_is_ptr(maybe_type);
+ if (is_scalar)
+ return LLVMBuildICmp(g->builder, LLVMIntNE, maybe_handle, LLVMConstNull(get_llvm_type(g, maybe_type)), "");
+
+ LLVMValueRef maybe_field_ptr = LLVMBuildStructGEP(g->builder, maybe_handle, maybe_null_index, "");
+ return gen_load_untyped(g, maybe_field_ptr, 0, false, "");
}
static LLVMValueRef ir_render_test_non_null(CodeGen *g, IrExecutable *executable,