diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/ir.cpp | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/src/ir.cpp b/src/ir.cpp index b0fc8dccd7..77c7c74197 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -27851,9 +27851,15 @@ static IrInstGen *ir_analyze_int_to_ptr(IrAnalyze *ira, IrInst* source_instr, Ir } IrInstGen *result = ir_const(ira, source_instr, ptr_type); - result->value->data.x_ptr.special = ConstPtrSpecialHardCodedAddr; - result->value->data.x_ptr.mut = ConstPtrMutRuntimeVar; - result->value->data.x_ptr.data.hard_coded_addr.addr = addr; + if (ptr_type->id == ZigTypeIdOptional && addr == 0) { + result->value->data.x_ptr.special = ConstPtrSpecialNull; + result->value->data.x_ptr.mut = ConstPtrMutComptimeConst; + } else { + result->value->data.x_ptr.special = ConstPtrSpecialHardCodedAddr; + result->value->data.x_ptr.mut = ConstPtrMutRuntimeVar; + result->value->data.x_ptr.data.hard_coded_addr.addr = addr; + } + return result; } @@ -27911,15 +27917,15 @@ static IrInstGen *ir_analyze_instruction_ptr_to_int(IrAnalyze *ira, IrInstSrcPtr ZigType *usize = ira->codegen->builtin_types.entry_usize; - // We check size explicitly so we can use get_src_ptr_type here. - if (get_src_ptr_type(target->value->type) == nullptr) { + ZigType *src_ptr_type = get_src_ptr_type(target->value->type); + if (src_ptr_type == nullptr) { ir_add_error(ira, &target->base, buf_sprintf("expected pointer, found '%s'", buf_ptr(&target->value->type->name))); return ira->codegen->invalid_inst_gen; } bool has_bits; - if ((err = type_has_bits2(ira->codegen, target->value->type, &has_bits))) + if ((err = type_has_bits2(ira->codegen, src_ptr_type, &has_bits))) return ira->codegen->invalid_inst_gen; if (!has_bits) { @@ -27932,11 +27938,19 @@ static IrInstGen *ir_analyze_instruction_ptr_to_int(IrAnalyze *ira, IrInstSrcPtr ZigValue *val = ir_resolve_const(ira, target, UndefBad); if (!val) return ira->codegen->invalid_inst_gen; - if (val->type->id == ZigTypeIdPointer && val->data.x_ptr.special == ConstPtrSpecialHardCodedAddr) { + + // Since we've already run this type trough get_codegen_ptr_type it is + // safe to access the x_ptr fields + if (val->data.x_ptr.special == ConstPtrSpecialHardCodedAddr) { IrInstGen *result = ir_const(ira, &instruction->base.base, usize); bigint_init_unsigned(&result->value->data.x_bigint, val->data.x_ptr.data.hard_coded_addr.addr); result->value->type = usize; return result; + } else if (val->data.x_ptr.special == ConstPtrSpecialNull) { + IrInstGen *result = ir_const(ira, &instruction->base.base, usize); + bigint_init_unsigned(&result->value->data.x_bigint, 0); + result->value->type = usize; + return result; } } |
