From c79da0d731aa6ba5e17da6ae92443c6588740b02 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Wed, 20 Sep 2023 14:16:07 -0700 Subject: [PATCH] Sema: allow users to provide alignment 0 to mean default --- src/Sema.zig | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/Sema.zig b/src/Sema.zig index 1eea36ec51a0c2f7b4b04f9b95fc05d2d75331f0..41e74eae0778618ccd01940ac1bb354204cffef9 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -2513,7 +2513,18 @@ fn validateAlign( src: LazySrcLoc, alignment: u64, ) !Alignment { - if (alignment == 0) return sema.fail(block, src, "alignment must be >= 1", .{}); + const result = try validateAlignAllowZero(sema, block, src, alignment); + if (result == .none) return sema.fail(block, src, "alignment must be >= 1", .{}); + return result; +} + +fn validateAlignAllowZero( + sema: *Sema, + block: *Block, + src: LazySrcLoc, + alignment: u64, +) !Alignment { + if (alignment == 0) return .none; if (!std.math.isPowerOfTwo(alignment)) { return sema.fail(block, src, "alignment value '{d}' is not a power of two", .{ alignment, @@ -18928,7 +18939,7 @@ fn zirPtrType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air else => {}, } const align_bytes = (try val.getUnsignedIntAdvanced(mod, sema)).?; - break :blk try sema.validateAlign(block, align_src, align_bytes); + break :blk try sema.validateAlignAllowZero(block, align_src, align_bytes); } else .none; const address_space: std.builtin.AddressSpace = if (inst_data.flags.has_addrspace) blk: { @@ -20890,7 +20901,7 @@ fn zirReify( } const alignment = alignment: { - const alignment = try sema.validateAlign(block, src, alignment_val.toUnsignedInt(mod)); + const alignment = try sema.validateAlignAllowZero(block, src, alignment_val.toUnsignedInt(mod)); const default = target_util.defaultFunctionAlignment(target); break :alignment if (alignment == default) .none else alignment; }; @@ -24588,7 +24599,7 @@ fn zirFuncFancy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A if (val.isGenericPoison()) { break :blk null; } - const alignment = try sema.validateAlign(block, align_src, val.toUnsignedInt(mod)); + const alignment = try sema.validateAlignAllowZero(block, align_src, val.toUnsignedInt(mod)); const default = target_util.defaultFunctionAlignment(target); break :blk if (alignment == default) .none else alignment; } 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 }, else => |e| return e, }; - const alignment = try sema.validateAlign(block, align_src, align_tv.val.toUnsignedInt(mod)); + const alignment = try sema.validateAlignAllowZero(block, align_src, align_tv.val.toUnsignedInt(mod)); const default = target_util.defaultFunctionAlignment(target); break :blk if (alignment == default) .none else alignment; } else .none; -- 2.54.0