| ... | @@ -16352,7 +16352,12 @@ fn zirAlignCast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A | ... | @@ -16352,7 +16352,12 @@ fn zirAlignCast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A |
| 16352 | const ptr_int = try block.addUnOp(.ptrtoint, actual_ptr); | 16352 | const ptr_int = try block.addUnOp(.ptrtoint, actual_ptr); |
| 16353 | const remainder = try block.addBinOp(.bit_and, ptr_int, align_minus_1); | 16353 | const remainder = try block.addBinOp(.bit_and, ptr_int, align_minus_1); |
| 16354 | const is_aligned = try block.addBinOp(.cmp_eq, remainder, .zero_usize); | 16354 | const is_aligned = try block.addBinOp(.cmp_eq, remainder, .zero_usize); |
| 16355 | try sema.addSafetyCheck(block, is_aligned, .incorrect_alignment); | 16355 | const ok = if (ptr_ty.isSlice()) ok: { |
| | 16356 | const len = try sema.analyzeSliceLen(block, ptr_src, ptr); |
| | 16357 | const len_zero = try block.addBinOp(.cmp_eq, len, try sema.addConstant(Type.usize, Value.zero)); |
| | 16358 | break :ok try block.addBinOp(.bit_or, len_zero, is_aligned); |
| | 16359 | } else is_aligned; |
| | 16360 | try sema.addSafetyCheck(block, ok, .incorrect_alignment); |
| 16356 | } | 16361 | } |
| 16357 | return sema.coerceCompatiblePtrs(block, dest_ty, ptr, ptr_src); | 16362 | return sema.coerceCompatiblePtrs(block, dest_ty, ptr, ptr_src); |
| 16358 | } | 16363 | } |