authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-09-20 14:16:07-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-09-21 14:48:40-07:00
logc79da0d731aa6ba5e17da6ae92443c6588740b02
treeda407b3313c0c69202b9cc64fdbd950702e11408
parentada83fa55773c8f8ff1bc2643c6525c3dfe871bf

Sema: allow users to provide alignment 0 to mean default


1 files changed, 16 insertions(+), 5 deletions(-)

src/Sema.zig+16-5
...@@ -2513,7 +2513,18 @@ fn validateAlign(...@@ -2513,7 +2513,18 @@ fn validateAlign(
2513 src: LazySrcLoc,2513 src: LazySrcLoc,
2514 alignment: u64,2514 alignment: u64,
2515) !Alignment {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
2521fn validateAlignAllowZero(
2522 sema: *Sema,
2523 block: *Block,
2524 src: LazySrcLoc,
2525 alignment: u64,
2526) !Alignment {
2527 if (alignment == 0) return .none;
2517 if (!std.math.isPowerOfTwo(alignment)) {2528 if (!std.math.isPowerOfTwo(alignment)) {
2518 return sema.fail(block, src, "alignment value '{d}' is not a power of two", .{2529 return sema.fail(block, src, "alignment value '{d}' is not a power of two", .{
2519 alignment,2530 alignment,
...@@ -18928,7 +18939,7 @@ fn zirPtrType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air...@@ -18928,7 +18939,7 @@ fn zirPtrType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air
18928 else => {},18939 else => {},
18929 }18940 }
18930 const align_bytes = (try val.getUnsignedIntAdvanced(mod, sema)).?;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 } else .none;18943 } else .none;
1893318944
18934 const address_space: std.builtin.AddressSpace = if (inst_data.flags.has_addrspace) blk: {18945 const address_space: std.builtin.AddressSpace = if (inst_data.flags.has_addrspace) blk: {
...@@ -20890,7 +20901,7 @@ fn zirReify(...@@ -20890,7 +20901,7 @@ fn zirReify(
20890 }20901 }
2089120902
20892 const alignment = alignment: {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 const default = target_util.defaultFunctionAlignment(target);20905 const default = target_util.defaultFunctionAlignment(target);
20895 break :alignment if (alignment == default) .none else alignment;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,7 +24599,7 @@ fn zirFuncFancy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A
24588 if (val.isGenericPoison()) {24599 if (val.isGenericPoison()) {
24589 break :blk null;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 const default = target_util.defaultFunctionAlignment(target);24603 const default = target_util.defaultFunctionAlignment(target);
24593 break :blk if (alignment == default) .none else alignment;24604 break :blk if (alignment == default) .none else alignment;
24594 } else if (extra.data.bits.has_align_ref) blk: {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,7 +24613,7 @@ fn zirFuncFancy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A
24602 },24613 },
24603 else => |e| return e,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 const default = target_util.defaultFunctionAlignment(target);24617 const default = target_util.defaultFunctionAlignment(target);
24607 break :blk if (alignment == default) .none else alignment;24618 break :blk if (alignment == default) .none else alignment;
24608 } else .none;24619 } else .none;