| ... | @@ -1577,8 +1577,7 @@ pub fn setupErrorReturnTrace(sema: *Sema, block: *Block, last_arg_index: usize) | ... | @@ -1577,8 +1577,7 @@ pub fn setupErrorReturnTrace(sema: *Sema, block: *Block, last_arg_index: usize) |
| 1577 | | 1577 | |
| 1578 | // st.index = 0; | 1578 | // st.index = 0; |
| 1579 | const index_field_ptr = try sema.fieldPtr(&err_trace_block, src, st_ptr, "index", src, true); | 1579 | const index_field_ptr = try sema.fieldPtr(&err_trace_block, src, st_ptr, "index", src, true); |
| 1580 | const zero = try sema.addConstant(Type.usize, Value.zero); | 1580 | try sema.storePtr2(&err_trace_block, src, index_field_ptr, src, .zero_usize, src, .store); |
| 1581 | try sema.storePtr2(&err_trace_block, src, index_field_ptr, src, zero, src, .store); | | |
| 1582 | | 1581 | |
| 1583 | // @errorReturnTrace() = &st; | 1582 | // @errorReturnTrace() = &st; |
| 1584 | _ = try err_trace_block.addUnOp(.set_err_return_trace, st_ptr); | 1583 | _ = try err_trace_block.addUnOp(.set_err_return_trace, st_ptr); |
| ... | @@ -17134,7 +17133,7 @@ fn zirAlignCast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A | ... | @@ -17134,7 +17133,7 @@ fn zirAlignCast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A |
| 17134 | const is_aligned = try block.addBinOp(.cmp_eq, remainder, .zero_usize); | 17133 | const is_aligned = try block.addBinOp(.cmp_eq, remainder, .zero_usize); |
| 17135 | const ok = if (ptr_ty.isSlice()) ok: { | 17134 | const ok = if (ptr_ty.isSlice()) ok: { |
| 17136 | const len = try sema.analyzeSliceLen(block, ptr_src, ptr); | 17135 | const len = try sema.analyzeSliceLen(block, ptr_src, ptr); |
| 17137 | const len_zero = try block.addBinOp(.cmp_eq, len, try sema.addConstant(Type.usize, Value.zero)); | 17136 | const len_zero = try block.addBinOp(.cmp_eq, len, .zero_usize); |
| 17138 | break :ok try block.addBinOp(.bit_or, len_zero, is_aligned); | 17137 | break :ok try block.addBinOp(.bit_or, len_zero, is_aligned); |
| 17139 | } else is_aligned; | 17138 | } else is_aligned; |
| 17140 | try sema.addSafetyCheck(block, ok, .incorrect_alignment); | 17139 | try sema.addSafetyCheck(block, ok, .incorrect_alignment); |
| ... | @@ -21957,7 +21956,6 @@ fn coerceExtra( | ... | @@ -21957,7 +21956,6 @@ fn coerceExtra( |
| 21957 | .ok => {}, | 21956 | .ok => {}, |
| 21958 | else => break :src_c_ptr, | 21957 | else => break :src_c_ptr, |
| 21959 | } | 21958 | } |
| 21960 | // TODO add safety check for null pointer | | |
| 21961 | return sema.coerceCompatiblePtrs(block, dest_ty, inst, inst_src); | 21959 | return sema.coerceCompatiblePtrs(block, dest_ty, inst, inst_src); |
| 21962 | } | 21960 | } |
| 21963 | | 21961 | |
| ... | @@ -24430,6 +24428,22 @@ fn coerceCompatiblePtrs( | ... | @@ -24430,6 +24428,22 @@ fn coerceCompatiblePtrs( |
| 24430 | return sema.addConstant(dest_ty, val); | 24428 | return sema.addConstant(dest_ty, val); |
| 24431 | } | 24429 | } |
| 24432 | try sema.requireRuntimeBlock(block, inst_src, null); | 24430 | try sema.requireRuntimeBlock(block, inst_src, null); |
| | 24431 | const inst_ty = sema.typeOf(inst); |
| | 24432 | const inst_allows_zero = (inst_ty.zigTypeTag() == .Pointer and inst_ty.ptrAllowsZero()) or true; |
| | 24433 | if (block.wantSafety() and inst_allows_zero and !dest_ty.ptrAllowsZero()) { |
| | 24434 | const actual_ptr = if (inst_ty.isSlice()) |
| | 24435 | try sema.analyzeSlicePtr(block, inst_src, inst, inst_ty) |
| | 24436 | else |
| | 24437 | inst; |
| | 24438 | const ptr_int = try block.addUnOp(.ptrtoint, actual_ptr); |
| | 24439 | const is_non_zero = try block.addBinOp(.cmp_neq, ptr_int, .zero_usize); |
| | 24440 | const ok = if (inst_ty.isSlice()) ok: { |
| | 24441 | const len = try sema.analyzeSliceLen(block, inst_src, inst); |
| | 24442 | const len_zero = try block.addBinOp(.cmp_eq, len, .zero_usize); |
| | 24443 | break :ok try block.addBinOp(.bit_or, len_zero, is_non_zero); |
| | 24444 | } else is_non_zero; |
| | 24445 | try sema.addSafetyCheck(block, ok, .cast_to_null); |
| | 24446 | } |
| 24433 | return sema.bitCast(block, dest_ty, inst, inst_src); | 24447 | return sema.bitCast(block, dest_ty, inst, inst_src); |
| 24434 | } | 24448 | } |
| 24435 | | 24449 | |