| ... | ... | @@ -2513,7 +2513,18 @@ fn validateAlign( |
| 2513 | 2513 | src: LazySrcLoc, |
| 2514 | 2514 | alignment: u64, |
| 2515 | 2515 | ) !Alignment { |
| 2516 | | if (alignment == 0) return sema.fail(block, src, "alignment must be >= 1", .{}); |
| 2516 | const result = try validateAlignAllowZero(sema, block, src, alignment); |
| 2517 | if (result == .none) return sema.fail(block, src, "alignment must be >= 1", .{}); |
| 2518 | return result; |
| 2519 | } |
| 2520 | |
| 2521 | fn validateAlignAllowZero( |
| 2522 | sema: *Sema, |
| 2523 | block: *Block, |
| 2524 | src: LazySrcLoc, |
| 2525 | alignment: u64, |
| 2526 | ) !Alignment { |
| 2527 | if (alignment == 0) return .none; |
| 2517 | 2528 | if (!std.math.isPowerOfTwo(alignment)) { |
| 2518 | 2529 | return sema.fail(block, src, "alignment value '{d}' is not a power of two", .{ |
| 2519 | 2530 | alignment, |
| ... | ... | @@ -18928,7 +18939,7 @@ fn zirPtrType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air |
| 18928 | 18939 | else => {}, |
| 18929 | 18940 | } |
| 18930 | 18941 | const align_bytes = (try val.getUnsignedIntAdvanced(mod, sema)).?; |
| 18931 | | break :blk try sema.validateAlign(block, align_src, align_bytes); |
| 18942 | break :blk try sema.validateAlignAllowZero(block, align_src, align_bytes); |
| 18932 | 18943 | } else .none; |
| 18933 | 18944 | |
| 18934 | 18945 | const address_space: std.builtin.AddressSpace = if (inst_data.flags.has_addrspace) blk: { |
| ... | ... | @@ -20890,7 +20901,7 @@ fn zirReify( |
| 20890 | 20901 | } |
| 20891 | 20902 | |
| 20892 | 20903 | const alignment = alignment: { |
| 20893 | | const alignment = try sema.validateAlign(block, src, alignment_val.toUnsignedInt(mod)); |
| 20904 | const alignment = try sema.validateAlignAllowZero(block, src, alignment_val.toUnsignedInt(mod)); |
| 20894 | 20905 | const default = target_util.defaultFunctionAlignment(target); |
| 20895 | 20906 | break :alignment if (alignment == default) .none else alignment; |
| 20896 | 20907 | }; |
| ... | ... | @@ -24588,7 +24599,7 @@ fn zirFuncFancy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A |
| 24588 | 24599 | if (val.isGenericPoison()) { |
| 24589 | 24600 | break :blk null; |
| 24590 | 24601 | } |
| 24591 | | const alignment = try sema.validateAlign(block, align_src, val.toUnsignedInt(mod)); |
| 24602 | const alignment = try sema.validateAlignAllowZero(block, align_src, val.toUnsignedInt(mod)); |
| 24592 | 24603 | const default = target_util.defaultFunctionAlignment(target); |
| 24593 | 24604 | break :blk if (alignment == default) .none else alignment; |
| 24594 | 24605 | } else if (extra.data.bits.has_align_ref) blk: { |
| ... | ... | @@ -24602,7 +24613,7 @@ fn zirFuncFancy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A |
| 24602 | 24613 | }, |
| 24603 | 24614 | else => |e| return e, |
| 24604 | 24615 | }; |
| 24605 | | const alignment = try sema.validateAlign(block, align_src, align_tv.val.toUnsignedInt(mod)); |
| 24616 | const alignment = try sema.validateAlignAllowZero(block, align_src, align_tv.val.toUnsignedInt(mod)); |
| 24606 | 24617 | const default = target_util.defaultFunctionAlignment(target); |
| 24607 | 24618 | break :blk if (alignment == default) .none else alignment; |
| 24608 | 24619 | } else .none; |