diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2019-05-08 16:06:34 -0400 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2019-05-08 16:06:34 -0400 |
| commit | 50bbb34594eedf7a978c00edb525bcea472b554b (patch) | |
| tree | 4936a28958fea277de9702b582bd13bc0ddeda83 /src/codegen.cpp | |
| parent | be7cacfbbec8aed234a0316d11a9ae0e8cda0286 (diff) | |
| download | zig-50bbb34594eedf7a978c00edb525bcea472b554b.tar.gz zig-50bbb34594eedf7a978c00edb525bcea472b554b.zip | |
C pointers support `null`
See #1967
Diffstat (limited to 'src/codegen.cpp')
| -rw-r--r-- | src/codegen.cpp | 22 |
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, |
